C#sqlite中的多线程

and*_*der 6 c# sqlite multithreading

我在C#wpf应用程序中编程并使用Sqlite数据库.比方说我有25个辅助线程都在等待对数据库执行插入操作.现在主线程对数据库执行选择操作.我可能错了,但这个主线程会等待一段时间.我如何确保.所以我在我的日志文件中锁定了数据库.如何确保主线程获得最高优先级,以便我的UI不被阻止.我正在使用DBContext对象来执行数据库操作.

dbw*_*dbw 10

聪明地使用ReaderWriterLockSlim肯定会帮助您提高性能.

    private ReaderWriterLockSlim _readerWriterLock = new ReaderWriterLockSlim();

    private DataTable RunSelectSQL(string Sql)
    {
        DataTable selectDataTable = null;
        try
        {
            _readerWriterLock.EnterReadLock();                
            //Function to acess your database and return the selected results
        }
        finally
        {
            _readerWriterLock.ExitReadLock();
        }
        return selectDataTable;
    }

    private DataTable RunInsertSQL(string Sql)
    {
        DataTable selectDataTable = null;
        bool isbreaked = false;
        try
        {
            _readerWriterLock.EnterWriteLock();
            if (_readerWriterLock.WaitingReadCount > 0)
            {
                isbreaked = true;
            }
            else
            {
                //Function to insert data in your database
            }
        }
        finally
        {
            _readerWriterLock.ExitWriteLock();
        }

        if (isbreaked)
        {
            Thread.Sleep(10);
            return RunInsertSQL(Sql);
        }
        return selectDataTable;
    }
Run Code Online (Sandbox Code Playgroud)

尝试这样做,提高您的响应能力,并且您可以Select查询具有比InsertSQL 更高的优先级.

请注意,如果某些插入已在运行,则Select将至少等待该插入完成.此代码将始终优先SELECT过度INSERT.

还有一点,从未在主线程上执行长时间持续操作,就像从数据库中选择一样,而是在后台执行操作,然后使用主线程在UI上反映最新结果.这将确保您的UI永远不会冻结.

编辑可能存在饥饿情况INSERT,如果有连续SELECT查询没有任何间隙,所有人都可能正在等待.
但我相信在你的情况下,这不会发生,因为UI如此频繁地获取最新的变化并不总是令人耳目一新.