WaitAny, WaitAll 和 SignalAndWait
除了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的更多相关文章
- C#中的线程(二) 线程同步基础
1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具: 简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...
- C#中的线程(中)-线程同步
1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具: 简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...
- C#编程技巧
拷贝/克隆(深度/浅拷贝).序列化.反射 Json/Xml 窗体的单例模式 https://www.cnblogs.com/imstrive/p/5426503.html 使用XmlSerialize ...
- C#中的线程(二)线程同步
C#中的线程(二)线程同步 Keywords:C# 线程Source:http://www.albahari.com/threading/Author: Joe AlbahariTranslato ...
- 第二十篇 .NET高级技术之C#中的线程(二) 线程同步基础
1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具: 简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...
- C#中的多线程 - 同步基础
原文:http://www.albahari.com/threading/part2.aspx 文章来源:http://blog.gkarch.com/threading/part2.html 1同步 ...
- C#学习笔记之线程 - 通知Signal
通知事件等待句柄 Signal With EventWaitHandle 事件等待句柄常用于通知.当一个线程等待直到接收到另外一个线程发出的信号.事件等待句柄是最简单的信号结构,它与C#事件无关.有三 ...
- Thread in depth 4:Synchronous primitives
There are some synchronization primitives in .NET used to achieve thread synchronization Monitor c# ...
- C#中的多线程 - 同步基础 z
原文:http://www.albahari.com/threading/part2.aspx 专题:C#中的多线程 1同步概要Permalink 在第 1 部分:基础知识中,我们描述了如何在线程上启 ...
随机推荐
- adaboost算法
三 Adaboost 算法 AdaBoost 是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器,即弱分类器,然后把这些弱分类器集合起来,构造一个更强的最终分类器.(很多博客里说的三个臭皮匠 ...
- Connection to http://www.google.com:80 refused
使用SDK Manager更新时出现问题 Failed to fetch URL https://dl-ssl.google.com/android/repository/repository-6.x ...
- (spring-第15回【IoC基础篇】)容器事件
五个人在报社订阅了报纸.报社一旦有了新报纸,就派员工分别送到这五个人手里.在这个例子中,“报纸”就是事件,“报社”就是广播器,五个订阅者就是监听器.广播器收到事件,把事件传给监听器,监听器对事件做一些 ...
- 极客DIY:RFID飞贼打造一款远距离渗透利器
本文使用最新的渗透工具RFID飞贼(Tastic RFID Thief)和RFID感应破解技术来获取一些拥有安防的建筑物的访问权限. Tastic RFID Thief是一个无声远距离RFID读卡器, ...
- Git使用详细教程
参考网址: http://www.admin10000.com/document/5374.html http://blog.sina.com.cn/s/blog_4f3b79d0010166ab.h ...
- iOS:死锁
死锁:指多个进程因竞争共享资源而造成的一种僵局,若无外力作用,这些进程都将永远不能再向前推进. 安全状态与不安全状态:安全状态指系统能按某个进程顺序来为每个进程分配其所需资源,直至最大需求,使每个进程 ...
- Logwatch的配置与使用
Logwatch是使用 Perl 开发的一个日志分析工具 Logwatch能够对Linux 的日志文件进行分析,并自动发送mail给相关处理人员,可定制需求 Logwatch的mail功能是借助宿主系 ...
- [转]慎用slice
在go中,slice是对固定长度数组的一段切片,其底层是用对数值空间的指针实现的. 在slice的赋值过程中,slice的容量会被初始化成“数组长度 - slice的起点位置”,举例说明: 假设有长度 ...
- php 多进程workman服务器框架
今天搜php socket,发现了一个给力的php写socket的框架workman,有机会要用用. 好给力,原来那个小蝌蚪聊天室就是用这个开发的. 仿佛发现了新大陆.
- Find Minimum in Rotated Sorted Array II
Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed? Would ...