在 C# 中,線程間通信可以通過以下幾種方式實現:
使用 lock
關鍵字:lock
關鍵字可以用于同步代碼塊,確保同一時間只有一個線程可以訪問共享資源。當一個線程進入同步代碼塊時,其他線程必須等待該線程釋放鎖才能進入同步代碼塊。
private object _lockObject = new object();
public void ThreadMethod()
{
lock (_lockObject)
{
// 訪問共享資源
}
}
使用 Monitor
類:Monitor
類提供了更高級的線程同步機制,包括等待和通知功能。可以使用 Monitor.Enter()
和 Monitor.Exit()
方法來獲取和釋放鎖。
private readonly object _lockObject = new object();
public void ThreadMethod()
{
Monitor.Enter(_lockObject);
try
{
// 訪問共享資源
}
finally
{
Monitor.Exit(_lockObject);
}
}
使用 Semaphore
類:Semaphore
類是一個計數信號量,用于控制同時訪問共享資源的線程數。可以使用 Semaphore.WaitOne()
和 Semaphore.Release()
方法來請求和釋放許可。
private readonly Semaphore _semaphore = new Semaphore(1);
public void ThreadMethod()
{
_semaphore.WaitOne();
try
{
// 訪問共享資源
}
finally
{
_semaphore.Release();
}
}
使用 Monitor.Wait()
和 Monitor.Pulse()
方法:Monitor.Wait()
方法用于讓當前線程等待,直到被其他線程通過 Monitor.Pulse()
或 Monitor.PulseAll()
方法喚醒。Monitor.Pulse()
方法用于喚醒等待隊列中的一個線程,而 Monitor.PulseAll()
方法用于喚醒等待隊列中的所有線程。
private readonly object _lockObject = new object();
public void ThreadMethod1()
{
lock (_lockObject)
{
// 等待被喚醒
Monitor.Wait(_lockObject);
}
}
public void ThreadMethod2()
{
lock (_lockObject)
{
// 喚醒等待的線程
Monitor.Pulse(_lockObject);
}
}
使用 Mutex
類:Mutex
類是一個互斥量,用于確保同一時間只有一個線程可以訪問共享資源。可以使用 Mutex.WaitOne()
和 Mutex.ReleaseMutex()
方法來請求和釋放互斥量。
private readonly Mutex _mutex = new Mutex(true);
public void ThreadMethod()
{
_mutex.WaitOne();
try
{
// 訪問共享資源
}
finally
{
_mutex.ReleaseMutex();
}
}
使用 Channel
類:Channel
是 C# 7.0 引入的一種新型線程安全的數據結構,可以在不同的線程之間傳遞數據。可以使用 Channel.Create
方法創建一個通道,并使用 Channel.Reader
和 Channel.Writer
對象進行讀寫操作。
private Channel<int> _channel = Channel.CreateUnbounded<int>();
public async Task ThreadMethod1()
{
await _channel.Writer.WriteAsync(42);
}
public async Task ThreadMethod2()
{
int value = await _channel.Reader.ReadAsync();
Console.WriteLine(value);
}