ManualResetEvent
1.ManualResetEvent
ManualResetEvent用于多线程之间信号处理。通过ManualResetEvent对象的WaitOne方法,线程进入等待/阻塞状态,线程等待信号量。线程执行set方法发初信号量,阻塞的线程进入运行状态。
ManualResetEvent持有一个bool变量,当初始化为false时,调用waitone线程进入等待状态,等待信号量。如果设置为true线程不会阻塞。
class Program
{
static EventWaitHandle autoResetEvent = new ManualResetEvent(false);
static void Main(string[] args)
{
Task taskA = Task.Factory.StartNew(() =>
{
Console.WriteLine("客户1在排队等待付钱...");
autoResetEvent.WaitOne();
Console.WriteLine("通知来了,客户1付钱");
}
);
Task task2 = Task.Factory.StartNew(() =>
{
Console.WriteLine("客户2在排队等待付钱...");
autoResetEvent.WaitOne();
Console.WriteLine("通知来了,客户2付钱");
});
autoResetEvent.Set();
Console.ReadKey();
}
}
结果: 
ManualResetEvent.reset方法重新阻塞线程。
class Program { static EventWaitHandle autoResetEvent = new ManualResetEvent(false); static void Main(string[] args) { Task taskA = Task.Factory.StartNew(() => { Console.WriteLine("客户1在排队等待付钱..."); autoResetEvent.WaitOne(); Console.WriteLine("通知来了,客户1付钱"); } ); Task task2 = Task.Factory.StartNew(() => { Console.WriteLine("客户2在排队等待付钱..."); autoResetEvent.WaitOne(); Thread.Sleep(5000); Console.WriteLine("通知来了,客户2付钱"); }); autoResetEvent.Set(); Thread.Sleep(TimeSpan.FromSeconds(2)); autoResetEvent.Reset(); Console.ReadKey(); } }
客户2的付钱阻塞。

浙公网安备 33010602011771号