C#sqlite中的多线程

机器人

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

dbw

聪明地使用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;
    }

尝试此操作将提高您的响应速度,并且您Select要触发的查询比InsertSQL具有更高的优先级

请注意,如果某些插入已在运行,那么Select将至少等待该插入完成。此代码将始终优先于SELECTover INSERT

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

编辑可以有一个饥饿的所有情况下INSERT,可以等待,如果有持续SELECT而没有任何空隙被解雇的查询。
但是我相信您的情况不会发生,因为在UI如此频繁地获取最新更改的过程中,之间不会有任何间隔,因此它们不会总是刷新。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章