除了Set 和 WaitOne方法外,在类WaitHandle中还有一些用来创建复杂的同步过程的静态方法。

WaitAny, WaitAll 和 SignalAndWait使跨多个可能为不同类型的等待句柄变得容易。 SignalAndWait可能是最有用的了:他在某个WaitHandle上调用WaitOne,并在另一个WaitHandle上自动地调 用Set。 你可以在一对EventWaitHandle上装配两个线程,而让它们在某个时间点“相遇” 第一个线程像这样: WaitHandle.SignalAndWait (wh1, wh2); 同时第二个线程做相反的事情:WaitHandle.SignalAndWait (wh2, wh1);

WaitHandle.WaitAny等待一组等待句柄任意一个发出信号,WaitHandle.WaitAll等待所有给定的句柄发出信号。与票据 旋转门的例子类似,这些方法可能同时地等待所有的旋转门——通过在第一个打开的时候(WaitAny情况下),或者等待直到 它们所有的都打开(WaitAll情况下)。

private AutoResetEvent event_ImageCaptureCmp = new AutoResetEvent(false); //图像采集完成事件
private AutoResetEvent event_SoftTriggerCmp = new AutoResetEvent(false); //软件触发后,获取图片完成,防止两次触发,图像被覆盖
private AutoResetEvent event_TestComplete = new AutoResetEvent(false); //一个测试流程所有图片都处理完成

WaitHandle [] waitHandle = new WaitHandle[]{event_ImageCaptureCmp,
event_SoftTriggerCmp, event_TestComplete
};
event_TestComplete.Set();
int i = WaitHandle.WaitAny(waitHandle,1000);     //返回2 ,  ?没有任何Event 时,返回258

//不支持一个 STA 线程上针对多个句柄的 WaitAll。WaitAll 不能在单线程中使用

解决方法1

ThreadPool.QueueUserWorkItem(DoWork);

public void DoWork(object state)
{
ManualResetEvent[] manualEvents =
new ManualResetEvent[5];
for (int i = 0; i < 5; i++)
{
manualEvents[i] = new ManualResetEvent(true);
}
bool b = WaitHandle.WaitAll(manualEvents, 100);

b = true;
}

解决方法2

public bool Waitall()
{
ManualResetEvent[] manualEvents =
new ManualResetEvent[5];
for (int i = 0; i < 5; i++)
{
manualEvents[i] = new ManualResetEvent(true);
}
bool b = WaitHandle.WaitAll(manualEvents, 100);

return b;
}

public async void AsyncWaitAll()
{
await Task<bool>.Run<bool>(() => Waitall());
}

WaitAny, WaitAll 和 SignalAndWait的更多相关文章

  1. C#中的线程(二) 线程同步基础

    1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...

  2. C#中的线程(中)-线程同步

    1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...

  3. C#编程技巧

    拷贝/克隆(深度/浅拷贝).序列化.反射 Json/Xml 窗体的单例模式 https://www.cnblogs.com/imstrive/p/5426503.html 使用XmlSerialize ...

  4. C#中的线程(二)线程同步

    C#中的线程(二)线程同步   Keywords:C# 线程Source:http://www.albahari.com/threading/Author: Joe AlbahariTranslato ...

  5. 第二十篇 .NET高级技术之C#中的线程(二) 线程同步基础

    1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...

  6. C#中的多线程 - 同步基础

    原文:http://www.albahari.com/threading/part2.aspx 文章来源:http://blog.gkarch.com/threading/part2.html 1同步 ...

  7. C#学习笔记之线程 - 通知Signal

    通知事件等待句柄 Signal With EventWaitHandle 事件等待句柄常用于通知.当一个线程等待直到接收到另外一个线程发出的信号.事件等待句柄是最简单的信号结构,它与C#事件无关.有三 ...

  8. Thread in depth 4:Synchronous primitives

    There are some synchronization primitives in .NET used to achieve thread synchronization Monitor c# ...

  9. C#中的多线程 - 同步基础 z

    原文:http://www.albahari.com/threading/part2.aspx 专题:C#中的多线程 1同步概要Permalink 在第 1 部分:基础知识中,我们描述了如何在线程上启 ...

随机推荐

  1. php大力力 [025节] 来不及学习和分类的,大力力认为有价值的一些技术文章合集(大力力二叔公)(2015-08-27)

    php大力力 [025节] 来不及学习和分类的,大力力认为有价值的一些技术文章合集(大力力二叔公)(2015-08-27) 比较好的模版 免费模板网,提供大量DIV+CSS布局网页模板下载及后台管理 ...

  2. Tranparent/cutout/diffuse

    Shader "Tranparent/cutout/diffuse" { Properties {   //  _Color ("Main Color", Co ...

  3. magnetom模板制作

    我个人认为Magento模板制作的难点在于不了解Magento的架构,不会调动block.Magento的block调动几乎都是靠xml.在下面的内容会提及如何操作. 制作Magento模板的前提是: ...

  4. 如何在UIAlertView中显示进度条

    今天这个问题是,在一个iPhone程序中,我要在后台做大量的数据处理,希望在界面上显示一个进度条(Progress Bar)使得用户了解处理进度.这个进度条应该是在一个模态的窗口中,使界 今天这个问题 ...

  5. Howto add permanent static routes in Ubuntu

    Static routing is the term used to refer to the manual method used to set up routing. An administrat ...

  6. vs2013 c++代码内出现中文导致编译错误

    简单的做法就是,首先,菜单栏->文件->高级保存选项,选择utf-8 无签名, 然后,如果是发现注释语句里有中文,可以让注释语句与下行代码中间空一行, 如果是代码里有用到中文,那么就在中文 ...

  7. Core Java Volume I — 4.4. Static Fields and Methods

    4.4. Static Fields and MethodsIn all sample programs that you have seen, the main method is tagged w ...

  8. allpaths 使用

    软件下载与说明:http://www.broadinstitute.org/software/allpaths-lg/blog/?page_id=12 原始数据的深度要达到100以上. 至少要两个库, ...

  9. Android 2.3 不支持印度文

    Android 2.3 不支持印度文(hindi),即使你指定了相关的字符串也不行,它们一律显示为方格. 实际上,你在系统的语言设置界面也可以看到,印度文一行也是被显示为方格(既然是方格,如何知道它是 ...

  10. UI学习笔记---第八天

    UINavigationController的用法   界面间传值 UInavigationController继承于UIViewController,以栈的方式管理所控制的师徒控制器,至少要有一个被 ...