繁体   English   中英

C#sqlite中的多线程

[英]Multithreading in C# sqlite

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

聪明地使用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查询以获得比Insert SQL更高的优先级。

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

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

编辑如果有连续的SELECT查询被触发而没有任何间隙,那么可能存在所有INSERT可能正在等待的饥饿情况。
但我相信你的情况,这不会发生,因为UI不会总是令人耳目一新,以便频繁地获得最新的更改,而不需要任何时间片。

你在什么模式下运行数据库?

SQLite支持三种不同的线程模式:

  1. 单线程。 在此模式下,所有互斥锁都被禁用,并且SQLite一次不能在多个线程中使用。
  2. 多线程。 在这种模式下,只要在两个或多个线程中不同时使用单个数据库连接,SQLite就可以被多个线程安全地使用。
  3. 序列化。 在序列化模式下,SQLite可以被多个线程安全地使用而没有任何限制。

默认模式已序列化。

http://www.sqlite.org/threadsafe.html

似乎多线程是你想要的。 序列化数据库访问很

A在我的多线程缓存子系统中有完全相同的问题看起来它只是'System.Data.SQLite'库问题

添加此(带反射器)

“......;版本= 3;池化=真;最大池大小= 100;”

连接字符串解决了问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM