[英]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.