这个有点像是缩小版的mutex
还是很好理解的
相对mutex 使用的范围可能比较小一点。
class Program
{
static AutoResetEvent work = new AutoResetEvent(false);
static AutoResetEvent main = new AutoResetEvent(false);
static void P(int s)
{
Console.WriteLine($"第二线程要等待{s}");
Thread.Sleep(TimeSpan.FromSeconds(s));
Console.WriteLine("第二线程等待结束");
work.Set();//告诉work 不用等待
Console.WriteLine("等待主线程完成工作");
main.WaitOne();//main 堵塞
Thread.Sleep(TimeSpan.FromSeconds(s));
Console.WriteLine("第二线程结束");
work.Set();//不用等待
}
static void Main(string[] args)
{
var t = new Thread(() => P());
t.Start();
Console.WriteLine($"等待别的线程完成工作");
work.WaitOne();//设置work等待
Console.WriteLine("设置work线程等待");
Thread.Sleep(TimeSpan.FromSeconds());
Console.WriteLine("主线程等待5s 已经结束");
main.Set();//告诉main 不用等待
work.WaitOne();//告诉 work要等待
Console.WriteLine("主线程结束");
Console.ReadKey();
}
}
一般来说就是
在实例化的时候,要设置为false 如果为true 那waiteone就不会有效果。
其次 waiteone就是要堵塞,等待。
set就是发出解锁信号,让AutoResetEvent不再等待。
也是非常好理解的。
下面的例子是当实例化时 传入true时 为何waiteOne不再起效
static AutoResetEvent main = new AutoResetEvent(true); static void Main(string[] args)
{
if( main.WaitOne(, false))
{
Console.WriteLine("如果实例化AutoRecstEnvet向构造函数中传递true时 WaiteOne不会等待");
}
else
{
main.Set();
Console.WriteLine("所以直接解锁");
}
Console.ReadKey();
}
也就是当 实例化为true waiteone第一次时无法起效。
剩下的用法语也是相当简单的。
不过这个AutoResetEvent是无法用到进程之间的。
而且学习这个可以有助于理解Metux 的使用方式。