在使用基元线程同步构造中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();
}
}

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

转载于:https://www.cnblogs.com/huaan011/p/3570918.html

基元线程同步构造之waithandle中 waitone使用相关推荐

  1. python中线程同步_Python线程同步在实际应用中功能体现

    在Python编程语言中,对于线程的操作是一个比较重要的应用技术.我们将会在这篇文章中为大家详细介绍一下这方面的相关基础内容,Python线程同步的应用方式.多个执行线程经常要共享数据,如果仅仅读取共 ...

  2. CLR Via CSharp读书笔记(29) - 混合线程同步构造

    {TODO:} 转载于:https://www.cnblogs.com/thlzhf/p/3494561.html

  3. 【转】1.4异步编程:轻量级线程同步基元对象

    开始<异步编程:同步基元对象(下)> 示例:异步编程:轻量级线程同步基元对象.rar 在<异步编程:线程同步基元对象>中我介绍了.NET4.0之前为我们提供的各种同步基元(包括 ...

  4. [.Net线程处理系列]专题五:线程同步——事件构造

    引言: 其实这部分内容应该是属于专题四,因为这篇也是讲关于线程同步的,但是由于考虑到用户的阅读习惯问题,因为文章太长了,很多人不是很愿意看包括我也是这样的,同时也有和我说可以把代码弄成折叠的,这样就不 ...

  5. 【转】3.3(译)构建Async同步基元,Part 3 AsyncCountdownEvent

    传送门:异步编程系列目录-- 最近在学习.NET4.5关于"并行任务"的使用."并行任务"有自己的同步机制,没有显示给出类似如旧版本的:事件等待句柄.信号量.l ...

  6. JAVA中线程同步的方法(7种)汇总

    JAVA中线程同步的方法(7种)汇总 同步的方法: 一.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法. ...

  7. JAVA中线程同步的几种实现方法

    JAVA中线程同步的几种实现方法 一.synchronized同步的方法: 1.synchronized同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁, ...

  8. 关于C语言中线程同步的方式

    C语言中线程同步的方式 线程同步 互斥锁 读写锁 条件变量 信号量 线程同步 在多线程环境中,线程之间由于竞争共享资源(临界资源)容易引起数据不一致的问题.一般采用互斥锁(互斥信号量)解决,保证只有一 ...

  9. 细说C#多线程那些事 - 线程同步和多线程优先级

    上个文章分享了一些多线程的一些基础的知识,今天我们继续学习. 一.Task类 上次我们说了线程池,线程池的QueueUserWorkItem()方法发起一次异步的线程执行很简单 但是该方法最大的问题是 ...

最新文章

  1. 织梦最新版后台一键更新网站、更新文档HTML卡死的解决方法
  2. Centos7 关闭防火墙(转)
  3. 利用Flume将MySQL表数据准实时抽取到HDFS
  4. activiti流程跟踪图简单详解
  5. c语言goto语句用法_硬件工程师必知的10个C语言技巧
  6. 判别式模型和生成式模型的区别(discriminative model and generative model)
  7. Chapter 1 First Sight——37
  8. Vs2010 上的配置Opencv2.2
  9. H264三种码率控制方法(CBR, VBR, CVBR,)CRF和CQP
  10. Java管理员登录界面视图_JAVA实现普通用户和管理员用户同页面登录
  11. 三菱FX系列PLC备份电池电压低报警的处理方法
  12. 计算机扫描变文档,原来电脑上的扫描仪功能这么好用!纸质文档轻松转为电子格式...
  13. 58、【backtrader股票策略】两资产的配对交易策略(pairs trading strategy)
  14. 网站安全防护该怎么做?有什么具体措施?
  15. 【Java成王之路】EE初阶第二十四篇: Servlet
  16. xml文件读写(C#)
  17. LTE中语音业务时怎样实现?
  18. 微信小程序:从本地相册选择图片、相机拍照,并将所选图片上传到服务器
  19. 银河麒麟系统Java/NetCore开发环境
  20. C++ primer 学习笔记

热门文章

  1. Vue3.0 Composition API与Vue2.x 使用的 Options API
  2. 蓝色简约好看的个人接单HTML源码
  3. CSS: 深入理解BFC和Margin Collapse (margin叠加或者合并外边距)
  4. Web开发者必备:Web应用检查清单
  5. javascript 实现禁止右键,复制,选取文本 (兼容firefox,IE,chrome等主流浏览器)...
  6. PHP 使用concat的无限分类
  7. 人工智障学习笔记——梯度下降(1)基础变种
  8. HTML——初识html,元素 属性 段落 文本格式化 链接 头部入门
  9. 【python】sys.stdout输出不换行
  10. 【算法学习】最优二叉查找树(动态规划)