多线程中 ManualResetEvent 的用法
/// <summary> /// 手动重启 /// </summary> private ManualResetEvent manualReset = new ManualResetEvent(false);
if (suspend) { manualReset.WaitOne();//暂停发送 }
SuspendCommand = new RelayCommand(o => { suspend = true; manualReset.Reset(); }); RestoreCommand = new RelayCommand(o=> { suspend = false; manualReset.Set(); });
它可以通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可心访问资源
##
ManualResetEvent manualReset = new ManualResetEvent(false);
构造函数参数为 False:代表无信号,True:代表有信号
当无信号时,manualReset.WaitOne(); 代表没人通知它,所以它默认就是阻塞状态。调用Set()方法后代表有人通知它来信号了,它将停止阻塞。
当有信号时,manualReset.WaitOne(); 代表有人通知它,它将无阻塞。 调用Reset()方法代表有人通知它现在信号没了,它将继续开始阻塞。
在多线程开发中,时常用到 ManualResetEvent 与 AutoResetEvent 。 它们如同道路交通中的信号灯。两者之间有什么区别呢?
共同点:
均继承 EventWaitHandle 接口,因此,均具有以下功能:
Reset() //红灯
Set() //绿灯
WaitOne() // 等待信号
不同点:
AutoResetEvent 收到 Set 后 , 一次只能执行一个线程,其它线程继续 WaitOne 。
ManualResetEvent 收到 Set 后,所有处理 WaitOne 状态线程均继续执行。
参考文章:https://www.cnblogs.com/howtrace/p/11362284.html https://www.cnblogs.com/li-peng/p/3291306.html
运行图说明:
作者:江宁织造
博客:http://www.cnblogs.com/wgx0428/
博客:http://www.cnblogs.com/wgx0428/