以1个实例讲解ManualResetEvent的做用

来自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=349
GPS平台、网站建设、软件开发、系统运维,找森大网络科技!
http://cnsendnet.taobao.comphp

  1. 源码下载:
    下载地址:http://files.cnblogs.com/tianzhiliang/ManualResetEventDemo.rar
    Demo:
    以1个实例讲解ManualResetEvent的做用
  2. ManualResetEvent详解
    ManualResetEvent 容许线程经过发信号互相通讯。一般,此通讯涉及一个线程在其余线程进行以前必须完成的任务。当一个线程开始一个活动(此活动必须完成后,其余线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态,此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程能够继续进行的信号。并释放全部等待线程。一旦它被终止,ManualResetEvent 将保持终止状态(即对 WaitOne 的调用的线程将当即返回,并不阻塞),直到它被手动重置。能够经过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,若是初始状态处于终止状态,为 true;不然为 false。

代码在同级目录中有,这里就不贴出来了。
以1个实例讲解ManualResetEvent的做用
图1
从下图中能够看出,实例化ManualResetEvent对象时,传的是true,则将初始状态设置为终止。程序首次运行,两个线程都在持续运行,如图3所示
以1个实例讲解ManualResetEvent的做用
图2
以1个实例讲解ManualResetEvent的做用
图3
输入reset命令,执行Reset方法,将事件状态设置为非终止状态,致使线程阻止。因此两个线程方法都中止运行了
以1个实例讲解ManualResetEvent的做用
输入set命令,执行Set方法,将事件状态设置为终止状态,容许一个或多个等待线程继续,因此2个线程又都开始运行了。
以1个实例讲解ManualResetEvent的做用
![]
结论:WaitOne方法在这里很关键,阻止当前线程,直到当前 System.Threading.WaitHandle 收到信号。ManualResetEvent对象能够做为一个全局变量,多个线程能够访问它,若是ManualResetEvent对象实例化传的是true时,或者ManualResetEvent对象被执行Set方法时,写了.WaitOne的线程方法将继续执行;若是ManualResetEvent对象被执行Reset方法时,写了.WaitOne的线程方法将中止执行,一直等待,知道被执行了Set方法为止。
以1个实例讲解ManualResetEvent的做用
验证:以下图所示,注释了WaitOne方法,即便执行了Reset方法,因为没有WaitOne的控制,这两个线程同样的在运行。
以1个实例讲解ManualResetEvent的做用网络

来自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=349
GPS平台、网站建设、软件开发、系统运维,找森大网络科技!
http://cnsendnet.taobao.com运维

相关文章
相关标签/搜索