Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多线程安全SQLite_C#_Multithreading_Winforms_Sqlite - Fatal编程技术网

C# 多线程安全SQLite

C# 多线程安全SQLite,c#,multithreading,winforms,sqlite,C#,Multithreading,Winforms,Sqlite,我有一个类在Winforms上的C#中,它不是线程安全的,但我希望它是线程安全的。相反,SQLite不断出错,说数据库被锁定了。。数据库已锁定 然而,我已经计划好了:这意味着有一个队列是FIFO(这很好),但这个工作线程(非gui)正在与gui竞争,因为有些gui事件也需要进入db,它们相互碰撞。。导致项目失败,然后失控 我真正想要的是能够从我需要的任何线程获得SQLite连接,并期望它保持正常。我一直在MySQL中做这种事情,而且它在近15年中从未打嗝过 那么,我的问题是 有没有一种防弹的方法

我有一个类在Winforms上的
C#
中,它不是线程安全的,但我希望它是线程安全的。相反,
SQLite
不断出错,说数据库被锁定了。。数据库已锁定


然而,我已经计划好了:这意味着有一个队列是FIFO(这很好),但这个工作线程(非gui)正在与gui竞争,因为有些gui事件也需要进入db,它们相互碰撞。。导致项目失败,然后失控

我真正想要的是能够从我需要的任何线程获得SQLite连接,并期望它保持正常。我一直在MySQL中做这种事情,而且它在近15年中从未打嗝过

那么,我的问题是

有没有一种防弹的方法可以让SQLite查询简单地等待,有没有一种方法可以手动锁定事务(可能在它自己的线程中?)或者有没有一种简单的方法可以迫使SQLite不那么挑剔。有很多SQL正在运行,只有当我扩展Winforms应用程序时,这些问题才变得明显。我不能完全重写

顺便说一句,我使用这个DefaultTimeout来尝试获得一些收益,但这也只是降低了问题阈值,感觉不太理想

SQLiteConnectionStringBuilder builder = new SQLiteConnectionStringBuilder();
builder.DefaultTimeout = 200;
builder.DataSource = "some.sqlite";
builder.Version = 3;
conn = new SQLiteConnection(builder.ConnectionString);
conn.Open();

你不能“强迫SQLite不要这么挑剔”——它告诉你,如果你做了你想做的事情,就会发生不好的事情——例如崩溃、数据库损坏或更糟

我建议您考虑将对SQLite的访问包装在自己的线程中,然后将其视为具有适当线程可阻止接口的服务器。尽量避免使用共享资源。在它自己的线程上应该会让db感到高兴,并且您的其他代码可以根据需要阻塞或轮询,直到可以访问为止。作为一个好处,您将获得更多的多核灵活性

如果你不能做到这一点,你可以尝试使用“监视器”,有时被称为“同步”电话。然而,要非常清楚,这是一条充满陷阱的道路,只有在事后才容易发现


HTH

没有理由保持连接打开。打开它,获取数据,然后关闭它。请确保在处理完连接和命令后立即将其处理掉。使用语句将它们包装在
中。@LarsTech我这样做了,但没有什么区别,因为我正在排队插入,同时从两个线程中进行选择@Blorgbeard是的,我将使用
查看
“这意味着有一个队列是FIFO(可以),但这个工作线程(非gui)与GUI竞争是因为也有一些GUI事件需要转到db”--如果GUI线程也直接转到数据库,“一”队列有什么意义?它应该是排队查询并等待结果。@Blorgbeard这显然是我们的不同之处,没有任何隐含的原因说明为什么一个数据库不能为十几个并发连接提供服务,它是一个主结构,事实上:首先,它与文件系统的区别在于它允许并发事务。如果数据库不能成为数据库,我甚至不想要它。。这种奇怪的声明说SQLite“不应该被线程化”“我们做它是一种让步”是令人震惊的逻辑。它应该称自己为FlatFileLite谢谢,另一方面,我可能需要将它编译为线程安全的:如何检查我的SQLite DLL版本是否为sqlite3_threadsafe()?