在C#中,有多种方法可以实现线程间通信。以下是一些常见的方法:
使用共享变量:可以使用volatile关键字修饰共享变量,确保线程之间对该变量的读写是可见的。但这种方式并不能保证原子性操作。
class SharedData{ public volatile bool Flag = false;}// 线程1void Thread1(){ sharedData.Flag = true;}// 线程2void Thread2(){ while (!sharedData.Flag) ; // 等待Flag变为true}使用锁(Lock):锁可以确保在同一时间只有一个线程访问共享资源。
class SharedData{ private readonly object _lock = new object(); private int _counter; public void Increment() { lock (_lock) { _counter++; } } public int GetCounter() { lock (_lock) { return _counter; } }}使用Monitor类:Monitor类提供了Enter、Exit、Wait和Pulse方法,可以实现线程间的同步和通信。
class SharedData{ private readonly object _lock = new object(); private bool _flag = false; public void SetFlag() { Monitor.Enter(_lock); _flag = true; Monitor.Pulse(_lock); Monitor.Exit(_lock); } public void WaitForFlag() { Monitor.Enter(_lock); while (!_flag) { Monitor.Wait(_lock); } Monitor.Exit(_lock); }}使用事件(Event):可以使用AutoResetEvent或ManualResetEvent类实现线程间的通信。
class SharedData{ private readonly AutoResetEvent _event = new AutoResetEvent(false); public void SetEvent() { _event.Set(); } public void WaitForEvent() { _event.WaitOne(); }}使用Task和async/await:在.NET 4.0及更高版本中,可以使用Task和async/await关键字实现线程间的通信。
async Task Main(){ var task = Task.Run(() => { // 模拟长时间运行的任务 Thread.Sleep(1000); return "Hello from task!"; }); Console.WriteLine("Waiting for task..."); string result = await task; Console.WriteLine(result);}使用Concurrent集合:.NET提供了一些线程安全的集合,如ConcurrentQueue、ConcurrentStack和ConcurrentDictionary,可以用于线程间通信。
private ConcurrentQueue<int> _queue = new ConcurrentQueue<int>();// 生产者线程void Producer(){ _queue.Enqueue(1);}// 消费者线程void Consumer(){ if (_queue.TryDequeue(out int item)) { Console.WriteLine(item); }}根据你的需求和场景,可以选择合适的方法实现线程间通信。


