and*_*der 6 c# sqlite multithreading
我在C#wpf应用程序中编程并使用Sqlite数据库.比方说我有25个辅助线程都在等待对数据库执行插入操作.现在主线程对数据库执行选择操作.我可能错了,但这个主线程会等待一段时间.我如何确保.所以我在我的日志文件中锁定了数据库.如何确保主线程获得最高优先级,以便我的UI不被阻止.我正在使用DBContext对象来执行数据库操作.
dbw*_*dbw 10
聪明地使用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;
}
Run Code Online (Sandbox Code Playgroud)
尝试这样做,提高您的响应能力,并且您可以Select查询具有比InsertSQL 更高的优先级.
请注意,如果某些插入已在运行,则Select将至少等待该插入完成.此代码将始终优先SELECT过度INSERT.
还有一点,从未在主线程上执行长时间持续操作,就像从数据库中选择一样,而是在后台执行操作,然后使用主线程在UI上反映最新结果.这将确保您的UI永远不会冻结.
编辑可能存在饥饿情况INSERT,如果有连续SELECT查询没有任何间隙,所有人都可能正在等待.
但我相信在你的情况下,这不会发生,因为UI如此频繁地获取最新的变化并不总是令人耳目一新.
| 归档时间: |
|
| 查看次数: |
12146 次 |
| 最近记录: |