AutoResetEvent可以在线程与线程间传递信号,来告知其他线程自己已经完成某一阶段的任务。
两个AutoResetEvent实例的初始状态都是unsignaled。
调用任何一个WaitOne都会阻塞,直到Set。
如果初始状态(new时给了true)为Signaled,则WaitOne会立刻执行,然后自动切换回unsignaled
AutoResetEvent采用内核时间模式,等待时间不能太长。 这能被更好的ManualResetEventslim类替换,因为它是混合模式。
下方输出结果:
1等待另一个线程完成工作
2开始一个长期工作
3工作完成
4等待中线程完成它的工作
5第一阶段工作完成
6在主线程上做了些操作
7现在开始由第二线程执行第二阶段
8开始第二阶段
9工作完成
10工作全部完成
private static AutoResetEvent _workerEvent = new AutoResetEvent(false);
private static AutoResetEvent _mainEvent = new AutoResetEvent(false);
static void Process(int seconds)
{
Console.WriteLine("2开始一个长期工作");
Thread.Sleep(seconds);
Console.WriteLine("3工作完成");
Console.WriteLine("4等待中线程完成它的工作");
_workerEvent.Set();
_mainEvent.WaitOne();
Console.WriteLine("8开始第二阶段");
Thread.Sleep(seconds);
Console.WriteLine("9工作完成");
_workerEvent.Set();
}
static void Main(string[] args)
{
var t = new Thread(() => Process(10));
t.Start();
Console.WriteLine("1等待另一个线程完成工作");
_workerEvent.WaitOne();
Console.WriteLine("5第一阶段工作完成");
Console.WriteLine("6在主线程上做了些操作");
Thread.Sleep(5);
Console.WriteLine("7现在开始由第二线程执行第二阶段");
_mainEvent.Set();
_workerEvent.WaitOne();
Console.WriteLine("10工作全部完成");
Console.ReadLine();
}