在多线程编程中,线程之间的同步和通信是一个常见的需求。例如,我们可能需要一个子线程完成某些任务后通知主线程,并由主线程执行特定的动作。本文将基于一个示例程序,详细讲解如何使用 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 方法)。