簡體   English   中英

C#中的線程同步?

[英]Thread synchronization in C#?

我有很多小功能,每個小功能都會執行一個查詢。 我希望一次只運行一個功能,什么是線程同步的最佳可能方法是避免SQLite(C#)中的數據庫鎖定問題。

這些函數位於多個類中,您將如何鎖定所有DB類中的所有函數,以使任何一個DB類中的僅一個函數得以執行。

我將扮演惡魔的擁護者...如果一次只執行一個,為什么要在單獨的線程中調用它們? 我只是將工作項放入一個隊列中,並有一個線程一次讀取一個隊列。

編輯:根據我下面的評論,這是一個幫助器類的示例,您可以使用該類將數據訪問重構到更集中的位置。 這是一個非常基本的示例,未經測試。

class Database {
    private string connectionString;
    private readonly object syncRoot = new object();

    public Database(string connectionString) {
        this.connectionString = connectionString;
    }

    public void ExecuteReader(SqlCommand command, Action<IDataRecord> forEachRow) {
        lock (syncRoot) {
            using (var connection = new SqlConnection(connectionString)) {
                command.Connection = connection;
                connection.Open();

                using (var reader = command.ExecuteReader()) {
                    while (reader.Read()) {
                        forEachRow(reader);
                    }
                }
            }
        }
    }
}

var myDB = new Database("connection string");
var myCommand = new SqlCommand("select id from blah");
myDB.ExecuteReader(myCommand, row => Console.WriteLine("ID: {0}", row["id"]));

最簡單的方法是擁有一個公共對象並使用c#lock()關鍵字鎖定該對象。 但是,我發現在大型項目中管理起來比較麻煩,並且經常使用等待句柄

我將擁有一個函數,該函數獲取與DB的連接,然后具有一個必須調用的版本以發出等待句柄的信號。 在建立連接時,您可以嘗試等待引發錯誤,而不是陷入僵局。

要添加到重播的答案中,您需要以下代碼:

public class MyClass
{
    private readonly object lockObject = new object();

    public void MyMethod()
    {
        lock (lockObject)
        {
            // Do stuff
        }
    }

    public void AnotherMethod()
    {
        lock (lockObject)
        {
            // Do stuff
        }
    }
}

喬恩·斯凱特(Jon Skeet)具有出色的線程處理系列: http//www.yoda.arachsys.com/csharp/threads/

暫無
暫無

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

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