簡體   English   中英

C#sqlite中的多線程

[英]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支持三種不同的線程模式:

  1. 單線程。 在此模式下,所有互斥鎖都被禁用,並且SQLite一次不能在多個線程中使用。
  2. 多線程。 在這種模式下,只要在兩個或多個線程中不同時使用單個數據庫連接,SQLite就可以被多個線程安全地使用。
  3. 序列化。 在序列化模式下,SQLite可以被多個線程安全地使用而沒有任何限制。

默認模式已序列化。

http://www.sqlite.org/threadsafe.html

似乎多線程是你想要的。 序列化數據庫訪問很

A在我的多線程緩存子系統中有完全相同的問題看起來它只是'System.Data.SQLite'庫問題

添加此(帶反射器)

“......;版本= 3;池化=真;最大池大小= 100;”

連接字符串解決了問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM