在 C# 中,線程間通信可以通過以下幾種方式實(shí)現(xiàn):
使用 lock
關(guān)鍵字:lock
關(guān)鍵字可以用于同步代碼塊,確保同一時(shí)間只有一個(gè)線程可以訪問共享資源。當(dāng)一個(gè)線程進(jìn)入同步代碼塊時(shí),其他線程必須等待該線程釋放鎖才能進(jìn)入同步代碼塊。
private object _lockObject = new object();
public void ThreadMethod()
{
lock (_lockObject)
{
// 訪問共享資源
}
}
使用 Monitor
類:Monitor
類提供了更高級(jí)的線程同步機(jī)制,包括等待和通知功能??梢允褂?Monitor.Enter()
和 Monitor.Exit()
方法來獲取和釋放鎖。
private readonly object _lockObject = new object();
public void ThreadMethod()
{
Monitor.Enter(_lockObject);
try
{
// 訪問共享資源
}
finally
{
Monitor.Exit(_lockObject);
}
}
使用 Semaphore
類:Semaphore
類是一個(gè)計(jì)數(shù)信號(hào)量,用于控制同時(shí)訪問共享資源的線程數(shù)??梢允褂?Semaphore.WaitOne()
和 Semaphore.Release()
方法來請(qǐng)求和釋放許可。
private readonly Semaphore _semaphore = new Semaphore(1);
public void ThreadMethod()
{
_semaphore.WaitOne();
try
{
// 訪問共享資源
}
finally
{
_semaphore.Release();
}
}
使用 Monitor.Wait()
和 Monitor.Pulse()
方法:Monitor.Wait()
方法用于讓當(dāng)前線程等待,直到被其他線程通過 Monitor.Pulse()
或 Monitor.PulseAll()
方法喚醒。Monitor.Pulse()
方法用于喚醒等待隊(duì)列中的一個(gè)線程,而 Monitor.PulseAll()
方法用于喚醒等待隊(duì)列中的所有線程。
private readonly object _lockObject = new object();
public void ThreadMethod1()
{
lock (_lockObject)
{
// 等待被喚醒
Monitor.Wait(_lockObject);
}
}
public void ThreadMethod2()
{
lock (_lockObject)
{
// 喚醒等待的線程
Monitor.Pulse(_lockObject);
}
}
使用 Mutex
類:Mutex
類是一個(gè)互斥量,用于確保同一時(shí)間只有一個(gè)線程可以訪問共享資源??梢允褂?Mutex.WaitOne()
和 Mutex.ReleaseMutex()
方法來請(qǐng)求和釋放互斥量。
private readonly Mutex _mutex = new Mutex(true);
public void ThreadMethod()
{
_mutex.WaitOne();
try
{
// 訪問共享資源
}
finally
{
_mutex.ReleaseMutex();
}
}
使用 Channel
類:Channel
是 C# 7.0 引入的一種新型線程安全的數(shù)據(jù)結(jié)構(gòu),可以在不同的線程之間傳遞數(shù)據(jù)??梢允褂?Channel.Create
方法創(chuàng)建一個(gè)通道,并使用 Channel.Reader
和 Channel.Writer
對(duì)象進(jìn)行讀寫操作。
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);
}