在使用基元线程同步构造中waithandle中waitone方法的讲解:

    调用waithandle的waitone方法阻止当前线程(提前是其状态为Nonsignaled,即红灯),直到当前的 WaitHandle 收到绿灯信号。

    WaitHandle有两个状态"Signaled" and "Nonsignaled",前者可以理解为绿灯,绿灯状态时WaitOne方法无效,当前线程不会被阻止,后者可以理解为红灯,WaitOne()方法会阻止当前线程。

    (1):一般来说,初始状态都是"Nonsignaled",即红灯,这样当调用WaitOne时,线程会暂停掉,这正是通常情况下我们调用WaitOne时想要的效果。这也正是Reset(字面义“重置”)被定义为设成红灯的原因。所以初始化时参数用false,代表初始状态为红灯。

ManualResetEvent manualWait = new ManualResetEvent(false);
    (2): WaitHandle没有Set方法,所以不能使暂停的线程得以继续,所以 一般不单用WaitHandle。其常会用作参数,尤其是AutoResetEvent和ManualResetEvent都用到的情况,提供一定的通用性。
    AutoResetEventManualResetEvent都继承自WaitHandle,都有Set()和Reset()方法,当然也继承了WaitOne()方法和两个状态。
    (1)ManualResetEvent的Set()和Reset()方法即上面的功能,将状态分别设成绿灯和红灯。当一个手动重置事件为true时,它解除正在等待它的所有线程的阻塞,因为内核不将事件自动重置回false;相反,你的代码必须将事件手动重置回false.
    (2)AutoResetEvent比较特别,正如名字所示,在Set()完后,它会立即自动调用Reset,所以一般只用Set()方法。当一个自动重置事件为true时,它只唤醒一个阻塞的线程,因为在解除第一个线程的阻塞后,内核将事件自动重置为false。
说明:这类对象可以被用在多个并发线程中,只要调用WaitOne,则都会暂停运行。ManualResetEventSet,可以让所有这些线程都继续运行,Reset又都停止,而AutoResetEvent则通过Set可实现一次只有一个被阻止的线程释放。
     示例:
   

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.\nMain 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();
}
}

这是个人的一点点理解,希望大伙有好的意见再拍拍砖。。。。。。。

最新文章

  1. W3School-CSS 表格实例
  2. js 刷新窗口
  3. SQL Pass北京举办第11次线下活动,欢迎报名(本次活动特别邀请了来自微软总部Xin Jin博士)
  4. AR播放器
  5. PhpStorm的open in browser怎么修改端口和相对路径
  6. SonarLint插件的安装与使用
  7. Android小项目练习之一 项目简介
  8. Codeforces Gym 100002 D"Decoding Task" 数学
  9. uitableview的重用重叠问题
  10. STM32串口通信USART1转USART2问题解决
  11. css布局理解
  12. vue-cli@2的原理解析
  13. HotSpot虚拟机对象探秘(对象创建,对象内存布局,对象访问定位)
  14. (一)七种AOP实现方法
  15. poj 1151 (未完成) 扫描线 线段树 离散化
  16. byte[]->new String(byte[]) -> getByte()引发的不一致问题
  17. mongodb集群性能优化
  18. .join() ----- 是把列表中的元素用 "xx".join() 拼接成字符串
  19. 7款开源ERP系统比较
  20. java 集合stream操作

热门文章

  1. Servlet和JSP比较
  2. 【jmeter】jmeter环境搭建
  3. nginx在centos & ubuntu上的安装
  4. Django 命令行工具django-admin.py与manage.py
  5. github 改位置
  6. python的return self的用法
  7. Protocol Buffer Basics: Python
  8. uva140-暴力枚举
  9. Sum All Numbers in a Range(两数之间数字总和)
  10. SQLserver查看索引使用情况