在C#中,處理并發的常用方法是使用線程安全的數據結構和同步原語。以下是一些建議:
使用線程安全的數據結構:
ConcurrentQueue
:一個線程安全的隊列,適用于生產者-消費者場景。ConcurrentDictionary
:一個線程安全的字典,適用于鍵值對存儲。BlockingCollection
:一個線程安全的集合,可以用于在生產者和消費者之間傳遞數據。ReaderWriterLockSlim
:一個讀寫鎖,允許多個讀者同時訪問,但只允許一個寫入者。使用同步原語:
lock
:用于確保同一時間只有一個線程可以訪問共享資源。Monitor
:與lock
類似,但提供了更多的方法來控制鎖定。SemaphoreSlim
:一個信號量,用于限制同時訪問共享資源的線程數量。AutoResetEvent
和 ManualResetEvent
:用于線程間的同步,可以通知其他線程某個事件已經發生。使用異步編程:
async
和 await
:用于編寫異步代碼,避免阻塞當前線程。Task
和 Task<T>
:表示異步操作的結果。Thread
和 ThreadPool
:用于創建和管理線程。使用原子操作:
Interlocked
類提供了一組原子操作,如遞增、遞減和比較交換等,可以在不使用鎖的情況下實現線程安全。以下是一個簡單的示例,展示了如何使用lock
來保護共享資源:
public class ConcurrentCounter
{
private int _value;
private readonly object _lock = new object();
public void Increment()
{
lock (_lock)
{
_value++;
}
}
public int GetValue()
{
lock (_lock)
{
return _value;
}
}
}
在這個示例中,我們使用lock
來確保在同一時間只有一個線程可以訪問_value
變量。這樣可以避免并發問題。