AutoResetEvent ManualResetEvent WaitOne使用注意事项
公司还用这些老家伙没办法,用了几次这俩。每次用都要重新翻一下A片。
好好的A片楞是翻译成了禅经。把这东西弄成个玄学。微软也是吃枣药丸。参考了@风中灵药的blog.写的牛逼。
还有一些公司用到的风中灵药没有提及,我给自己留个tip.好以后看看。有错误希望大家指出。虽然我不一定改。
AutoResetEvent 、ManualResetEvent 两个用法都差不多。
无非是ManualResetEvent 可以通知到多个线程,然后开启后默认不关闭。需要手动关闭。
AutoResetEvent a1 = new AutoResetEvent(false);
ManualResetEvent m1 = new ManualResetEvent(false);
如果初始为true,就跟没有这两个东西一样,起不到阻塞当前线程,等待通知的继续运行的效果。所以用的时候都是初始化成false.
所以初始化为true有毛用。那当初为啥这样设计。翻了下金刚经更不懂了。等有缘人解答、
WaitOne();
这个如果初始化的AutoResetEvent 为false.如果没有set(),他会一直阻塞,也就是说就成死锁了。
--vs2012 win10 .net4.6.1
WaitOne(int); WaitOne(int,bool); WaitOne(timespan,bool);
这三个一样。int单位为毫秒,timespan就是时间间隔。
(1)这个如果初始化的AutoResetEvent 为false.如果在设置时间内返回,跟普通的wait()效果一样,阻塞然后运行;
static AutoResetEvent a1 = new AutoResetEvent(false);
static void Main(string[] args)
{
Thread th = new Thread(new ThreadStart(method));
th.Start();
Console.WriteLine("start.."+DateTime.Now.ToString("mm:ss fff"));
bool isback = a1.WaitOne();//设定时间
Console.WriteLine("end .." + DateTime.Now.ToString("mm:ss fff"));
Console.Read();
}
//do something
static void method()
{
Thread.Sleep();//阻塞一秒在设置时间内返回
Console.WriteLine("Async.." + DateTime.Now.ToString("mm:ss fff"));
a1.Set();
}
没有超过设定时间其他线程通知传回,本线程不阻塞,跟普通waitone一样。
(2)如果在设置时间内没有set(),时间在超过设置时间后就不会阻塞了。直接返回。貌似神器,可以设置时间然后运行一个线程或者异步的方法,然后超过一定时间返回给前面说超时了。
开发中用的这种情况很多啊。但是,如果异步方法或者线程在设置超时时间后set();那么下次再来到这个是可以直接运行的。不会引起阻塞。你需要reset()一下
返回参数为true代表 set触发,
返回参数为false代表超过设定时间,自动触发。
static AutoResetEvent a1 = new AutoResetEvent(false);
static void Main(string[] args)
{
Thread th = new Thread(new ThreadStart(method));
th.Start();
Console.WriteLine("start.."+DateTime.Now.ToString("mm:ss fff"));
bool isback = a1.WaitOne(,false);
Console.WriteLine("end .." + DateTime.Now.ToString("mm:ss fff")+ isback);
Console.Read();
}
//do something
static void method()
{
Thread.Sleep(); //超时返回
Console.WriteLine("Async.." + DateTime.Now.ToString("mm:ss fff"));
a1.Set();
}

运行结果表示超过两秒钟,不阻塞,直接执行,线程另外跑。然后这时间其他线程打开了通知,这个通知状态一直保存着,下次如果有程序进来,
bool isback = a1.WaitOne(2000,false);这里就不会阻塞,直接通过。
AutoResetEvent a1 = new AutoResetEvent(false);
private void button1_Click(object sender, EventArgs e)
{
Thread th = new Thread(new ThreadStart(method));
th.Start();
listBox1.Items.Add("start.." + DateTime.Now.ToString("mm:ss fff"));
bool isback = a1.WaitOne(, false);
listBox1.Items.Add("end .." + DateTime.Now.ToString("mm:ss fff") + isback);
}
void method()
{
Thread.Sleep(); //超时返回
this.Invoke(new Action(() => { listBox1.Items.Add("Async.." + DateTime.Now.ToString("mm:ss fff")); }));
a1.Set();
}
多次点击就会出现这种,点击第二次时,第一次其他线程的 set()发挥作用了。不阻塞直接返回了。这种是没有reset(),这样就起不到阻塞等待其他方法或线程的作用了加个reset,清楚下状态。
a1.Reset();
bool isback = a1.WaitOne(, true);

以此为标记。如果有错误欢迎指正。在此谢过。
AutoResetEvent ManualResetEvent WaitOne使用注意事项的更多相关文章
- C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEvent
看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex S ...
- [.net 多线程]AutoResetEvent, ManualResetEvent
ManualResetEvent: 通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可心访问资源. Set() : 用于向 ManualResetEvent 发送信号 ...
- 多线程中的锁系统(三)-WaitHandle、AutoResetEvent、ManualResetEvent
本章主要介绍下基于内核模式构造的线程同步方式,事件,信号量. 阅读目录: 理论 WaitHandle AutoResetEvent ManualResetEvent 总结 理论 Windows的线程同 ...
- C# ManualResetEvent和AutoResetEvent 使用笔记
一.两者区别 1.ManualResetEvent 调用一次Set()后将允许恢复所有被阻塞线程.需手动在调用WaitOne()之后调用Reset()重置信号量状态为非终止,然后再次调用WaitOne ...
- 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEvent, AutoResetEvent
[源码下载] 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEve ...
- 【C#】【Thread】ManualResetEvent和AutoResetEvent区别
ManualResetEvent和AutoResetEvent主要用于线程之间同步问题. 主要使用方法有Set();Reset();WaitOne(); Set():将事件状态设置为终止状态,允许一个 ...
- ManualResetEvent & AutoResetEvent
参考资料: 1. https://msdn.microsoft.com/en-us/library/system.threading.manualresetevent.aspx 2. https: ...
- 线程同步(AutoResetEvent与ManualResetEvent)
前言 在我们编写多线程程序时,会遇到这样一个问题:在一个线程处理的过程中,需要等待另一个线程处理的结果才能继续往下执行.比如:有两个线程,一个用来接收Socket数据,另一个用来处理Socket数据, ...
- 【深度好文】多线程之WaitHandle-->派生EventWaitHandle事件构造-》AutoResetEvent、ManualResetEvent
AutoResetEvent/ManualResetEvent 都是继承自 EventWaitHandle ,EventWaitHandle继承自WaitHandle. 在讨论这个问题之前,我们先了解 ...
随机推荐
- spring无法读取properties文件数据
只讲述异常点,关于怎么配置文件,这里不做说明. 1. controller中无法读取config.properties文件 controller中注入的@Value配置是从servlet-cont ...
- Atitit.研发管理软件公司的软资产列表指南
Atitit.研发管理软件公司的软资产列表指南 1. Isv模型下的软资产1 2. 实现层面implet1 3. 规范spec层1 4. 法则定律等val层的总结2 1. Isv模型下的软资产 Sof ...
- 从史上八大MySQL事故中学到的经验
本文列举了史上八大MySQL宕机事件原因.影响以及人们从中学到的经验,文中用地震级数来类比宕机事件的严重性和后果,排在最严重层级前两位的是由于亚马逊AWS宕机故障(相当于地震十级和九级). 一.Per ...
- Win10连接远程桌面时提示“您的凭据不工作”
我遇到这个问题的时候查找网上都给出一堆高大上的解决办法, 然而我的错误实际上是用户名的问题, 很多人以为远程用户名就一定是锁屏状态下的登录名, 其实不是,跟自己设置有关,所以首先应该检查远程用户名是否 ...
- Spring MVC类型转换器
类型转换器引入 为什么页面上输入"12",可以赋值给Handler方法对应的参数?这是因为框架内部帮我们做了类型转换的工作.将String转换成int 但默认类型转换器并不是可以将 ...
- 腾讯云 安装mono
一.yum -y update 运行出现以下错误: http://centos.tencentyun.com/contrib/x86_64/repodata/filelists.xml.gz: [Er ...
- 使用MonoTouch.Dialog简化iOS界面开发
MonoTouch.Dialog简称MT.D,是Xamarin.iOS的一个RAD工具包.它提供易于使用的声明式API,不需要使用导航控制器.表格等ViewController来定义复杂的应用程序UI ...
- 【初码干货】在Window Server 2016中使用Web Deploy方式发布.NET Web应用的重新梳理
在学习和工作的过程中,发现很多同事.朋友,在做.NET Web应用发布的时候,依然在走 生成-复制到服务器 这样的方式,稍微高级一点的,就是先发布到本地,再上传到服务器 这种方式不仅效率低下,而且不易 ...
- Nginx 配置简述
不论是本地开发,还是远程到 Server 开发,还是给提供 demo 给人看效果,我们时常需要对 Nginx 做配置,Nginx 的配置项相当多,如果考虑性能配置起来会比较麻烦.不过,我们往往只是需要 ...
- 单选按钮加confirm进行判断返回false任被选中问题
<html> <head> <script language="javascript"> var checkValue = "&quo ...

加个reset,清楚下状态。