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

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

基元线程同步构造之waithandle中 waitone使用的更多相关文章

  1. [.net]基元线程同步构造

    /* 基元线程同步构造 用户模式构造: 易变构造(Volatile Construct) 互锁构造(Interlocked Construct):自旋锁(Spinlock) 乐观锁(Optimisti ...

  2. 【C#进阶系列】28 基元线程同步构造

    多个线程同时访问共享数据时,线程同步能防止数据损坏.之所以要强调同时,是因为线程同步问题实际上就是计时问题. 不需要线程同步是最理想的情况,因为线程同步一般很繁琐,涉及到线程同步锁的获取和释放,容易遗 ...

  3. Clr Via C#读书笔记----基元线程同步构造

    线程文章:http://www.cnblogs.com/edisonchou/p/4848131.html 重点在于多个线程同时访问,保持线程的同步. 线程同步的问题: 1,线程同步比较繁琐,而且容易 ...

  4. 基元线程同步构造之 Mutes(互斥体)

    互斥体实现了“互相排斥”(mutual exclusion)同步的简单形式(所以名为互斥体(mutex)). 互斥体禁止多个线程同时进入受保护的代码“临界区”(critical section). 因 ...

  5. CLR via C# I/O基元线程同步构造

    1. 分为用户模式构造和内核模式构造 2. 用户模式构造 a.易失构造 在一个简单数据类型的变量上执行原子性读或写操作 VolaileWrite 强制address中的值在调用时写入,除此之外,按照源 ...

  6. 基元线程同步构造之信号量(Semaphore)

    信号量(semaphore)不过是由内核维护的 int32变量而已,(说通俗点就是好比一个线程容器里面允许执行的线程数,0计数就是允许执行的0个线程数,1就是允许执行的1个线程数,2就是允许执行的2个 ...

  7. 基元线程同步构造 AutoResetEvent和ManualResetEvent 线程同步

    在.Net多线程编程中,AutoResetEvent和ManualResetEvent这两个类经常用到, 他们的用法很类似,但也有区别.ManualResetEvent和AutoResetEvent都 ...

  8. 【C#进阶系列】29 混合线程同步构造

    上一章讲了基元线程同步构造,而其它的线程同步构造都是基于这些基元线程同步构造的,并且一般都合并了用户模式和内核模式构造,我们称之为混合线程同步构造. 在没有线程竞争时,混合线程提供了基于用户模式构造所 ...

  9. 【C#】C#线程_基元线程的同步构造

    目录结构: contents structure [+] 简介 为什么需要使用线程同步 线程同步的缺点 基元线程同步 什么是基元线程 基元用户模式构造和内核模式构造的比较 用户模式构造 易变构造(Vo ...

随机推荐

  1. opencart后台操作--第一节 多语言篇---中文语言包

    参考:http://www.cnblogs.com/404bozhu/p/5015108.html#3584448 OpenCart简体中文语言包 OpenCart V2.3.0.x 版权所有:www ...

  2. HighCharts定时刷新图表

    假设图表容器的id为exChart,如下: <div style="height:450px;" id="chart">   1. 首先在serie ...

  3. JS时间(日期)比较或相减(暂时停用)

    注:此文均来自网上,可行,只供参考 //JAVASCRIPT中 日期相减很麻烦 ,现在有现成的实现方法,拷贝过去就可以用了,方便 //调用该方法(主方法) function dateDiff(date ...

  4. Python 中的sort()排序

    v = [1, 3, 5, 2, 4, 6] v.sort() print(v) # [1, 2, 3, 4, 5, 6] v2 = [(1, 2), (2, 2), (2, 3), (3, 1)] ...

  5. redis在PHP中的基本使用案例(觉得比较实用)

    源地址  http://www.t086.com/article/4901

  6. Android中measure过程、WRAP_CONTENT详解以及 xml布局文件解析流程浅析

    转自:http://www.uml.org.cn/mobiledev/201211221.asp 今天,我着重讲解下如下三个内容: measure过程 WRAP_CONTENT.MATCH_PAREN ...

  7. 招募贴:Hadoop专业解决方案招募义务翻译人员

    一.招募启事 招募贴:Hadoop专业解决方案招募义务翻译人员,英文原著名称:<Wrox.Professional.Hadoop.Solutions>.愿意参与到此项工作中来的请加群:31 ...

  8. StringIO-将字符串当做文件处理

    StringIO将字符串当做文件处理,十分方便 >>> from StringIO import StringIO >>> file_like_string = S ...

  9. 峰Spring4学习(3)注入参数的几种类型

    People.java  model类: package com.cy.entity; import java.util.ArrayList; import java.util.HashMap; im ...

  10. 学习笔记之Cloud computing

    Cloud computing - Wikipedia https://en.wikipedia.org/wiki/Cloud_computing