我在Sqlite应用程序中编程并使用C#数据库,假设我有25个辅助线程,它们都在等待对数据库执行插入操作。现在,主线程在数据库上执行select操作。我可能错了,但这个主线程将等待一段时间。我该如何确保。所以我在我的日志文件中锁定了数据库。如何确保主线程获得最高优先级,这样我的UI才不会被阻塞。我正在使用DBContext对象来执行数据库操作。
发布于 2013-11-15 20:38:49
巧妙地使用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;
}尝试一下,它将提高您的响应性,并且您将拥有比Insert Select更高优先级的SQL查询。
请注意,如果某些插入已在运行,则选择将至少等待该插入完成。此代码将始终优先于INSERT,而不是SELECT。
再说一点,永远不要在主线程上执行长的正在进行的操作,就像你从数据库中选择一样,而是在后台执行操作,然后使用主线程在UI上反映最新的结果。这将确保您的UI永远不会冻结。
EDIT如果有连续的SELECT查询在没有任何间隙的情况下被触发,则可能会出现匮乏的情况,其中所有的INSERT可能都在等待。
但我相信在你的情况下,这不会发生,因为UI不会总是刷新,以获得最新的变化如此频繁,而没有任何时间片之间。
发布于 2013-11-15 21:05:07
您在什么模式下运行数据库?
SQLite支持三种不同的线程模式:
默认模式为序列化。
http://www.sqlite.org/threadsafe.html
看起来多线程就是你想要的。序列化数据库访问很慢。
发布于 2019-07-23 19:12:41
A在我的多线程缓存子系统中有完全相同的问题,看起来像是只有'System.Data.SQLite‘库问题
添加这个(在反射器中找到)
"...;Version=3;Pooling=True;Max池Size=100;“
连接字符串解决了这个问题。
https://stackoverflow.com/questions/20001129
复制相似问题