首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# sqlite中的多线程

C# sqlite中的多线程
EN

Stack Overflow用户
提问于 2013-11-15 20:29:35
回答 3查看 16.9K关注 0票数 6

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-15 20:38:49

巧妙地使用ReaderWriterLockSlim肯定会帮助您提高性能。

代码语言:javascript
复制
    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;
    }

尝试一下,它将提高您的响应性,并且您将拥有比Insert Select更高优先级的SQL查询。

请注意,如果某些插入已在运行,则选择将至少等待该插入完成。此代码将始终优先于INSERT,而不是SELECT

再说一点,永远不要在主线程上执行长的正在进行的操作,就像你从数据库中选择一样,而是在后台执行操作,然后使用主线程在UI上反映最新的结果。这将确保您的UI永远不会冻结。

EDIT如果有连续的SELECT查询在没有任何间隙的情况下被触发,则可能会出现匮乏的情况,其中所有的INSERT可能都在等待。

但我相信在你的情况下,这不会发生,因为UI不会总是刷新,以获得最新的变化如此频繁,而没有任何时间片之间。

票数 13
EN

Stack Overflow用户

发布于 2013-11-15 21:05:07

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

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

  1. Single-thread.在此模式下,将禁用所有互斥锁,并且在once.
  2. Multi-thread.的多个线程中使用SQLite是不安全的在此模式下,如果在两个或多个threads.
  3. Serialized.中没有同时使用单个数据库连接,则多个线程可以安全地使用SQLite在序列化模式下,多线程可以不受限制地安全地使用SQLite。

默认模式为序列化。

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

看起来多线程就是你想要的。序列化数据库访问很慢。

票数 3
EN

Stack Overflow用户

发布于 2019-07-23 19:12:41

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

添加这个(在反射器中找到)

"...;Version=3;Pooling=True;Max池Size=100;“

连接字符串解决了这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20001129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档