在使用基元线程同步构造中waithandle中waitone方法的讲解:
调用waithandle的waitone方法阻止当前线程(提前是其状态为Nonsignaled,即红灯),直到当前的 WaitHandle 收到绿灯信号。
WaitHandle有两个状态"Signaled" and "Nonsignaled",前者可以理解为绿灯,绿灯状态时WaitOne方法无效,当前线程不会被阻止,后者可以理解为红灯,WaitOne()方法会阻止当前线程。
(1):一般来说,初始状态都是"Nonsignaled",即红灯,这样当调用WaitOne时,线程会暂停掉,这正是通常情况下我们调用WaitOne时想要的效果。这也正是Reset(字面义“重置”)被定义为设成红灯的原因。所以初始化时参数用false,代表初始状态为红灯。
using System;
using System.Threading;
class WaitOne
{
//初始化为 false,即Nonsignaled,必须调用set后才能变成Signaled,
//autoEvent.WaitOne();之后的代码才会运行,如果去掉
//ThreadPool.QueueUserWorkItem( // new WaitCallback(WorkMethod), autoEvent);这段代码,
//autoEvent.WaitOne();之后的代码就永远不会运行了
//如果初始化为 true即 new AutoResetEvent(true),去掉 ThreadPool.QueueUserWorkItem( // new WaitCallback(WorkMethod), autoEvent);这段代码,
//autoEvent.WaitOne();之后的代码也可运行
static AutoResetEvent autoEvent = new AutoResetEvent(false);
static void Main()
{
Console.WriteLine("Main starting.");
ThreadPool.QueueUserWorkItem(
new WaitCallback(WorkMethod), autoEvent);
// Wait for work method to signal.
autoEvent.WaitOne();
Console.WriteLine("Work method signaled.
Main ending.");
Console.ReadLine();
}
static void WorkMethod(object stateInfo)
{
Console.WriteLine("Work starting.");
// Simulate time spent working.
Thread.Sleep(new Random().Next(100, 2000));
// Signal that work is finished.
Console.WriteLine("Work ending.");
((AutoResetEvent)stateInfo).Set();
}
}
这是个人的一点点理解,希望大伙有好的意见再拍拍砖。。。。。。。