在多线程编程中,线程之间的同步和通信是一个常见的需求。例如,我们可能需要一个子线程完成某些任务后通知主线程,并由主线程执行特定的动作。本文将基于一个示例程序,详细讲解如何使用 AutoResetEvent 来实现这种场景。
示例代码:
using System;
using System.Threading;class Program
{static void Main(string[] args){Console.WriteLine("Main thread started.");using (AutoResetEvent workDoneEvent = new AutoResetEvent(false)){// 创建并启动子线程Thread workerThread = new Thread(() => DoWork(workDoneEvent));workerThread.Start();// 主线程继续做其他事情,不会被阻塞for (int i = 0; i < 5; i++){Console.WriteLine("Main thread is working...");Thread.Sleep(1000);}// 等待子线程的通知int pollInterval = 500; // 轮询间隔(毫秒)while (true){if (workDoneEvent.WaitOne(0)){ExecuteCallback();break;}Thread.Sleep(pollInterval);}}Console.WriteLine("Main thread finished.");}static void DoWork(AutoResetEvent workDoneEvent){Console.WriteLine("Worker thread started.");Thread.Sleep(100); // 模拟工作Console.WriteLine("Worker thread finished.");// 通知主线程workDoneEvent.Set();}static void ExecuteCallback(){Thread.Sleep(500); // 模拟动作执行Console.WriteLine("Callback is invoked on Main thread.");}
}
程序的功能描述
上述代码实现了一个典型的多线程场景:
- 主线程启动后,创建并启动一个子线程。
- 子线程模拟执行某些工作(通过 Thread.Sleep(100) 模拟耗时操作)。
- 子线程完成后,通过 AutoResetEvent 通知主线程。
- 主线程收到通知后,执行特定的动作(ExecuteCallback 方法)。