我正在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永远不会冻结。
编辑可以有一个饥饿的所有情况下INSERT
,可以等待,如果有持续SELECT
而没有任何空隙被解雇的查询。
但是我相信您的情况不会发生,因为在UI
如此频繁地获取最新更改的过程中,之间不会有任何间隔,因此它们不会总是刷新。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句