[英]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支持三种不同的线程模式:
- 单线程。 在此模式下,所有互斥锁都被禁用,并且SQLite一次不能在多个线程中使用。
- 多线程。 在这种模式下,只要在两个或多个线程中不同时使用单个数据库连接,SQLite就可以被多个线程安全地使用。
- 序列化。 在序列化模式下,SQLite可以被多个线程安全地使用而没有任何限制。
默认模式已序列化。
http://www.sqlite.org/threadsafe.html
似乎多线程是你想要的。 序列化数据库访问很慢 。
A在我的多线程缓存子系统中有完全相同的问题看起来它只是'System.Data.SQLite'库问题
添加此(带反射器)
“......;版本= 3;池化=真;最大池大小= 100;”
连接字符串解决了问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.