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. 在讨论这个问题之前,我们先了解 ...
随机推荐
- 15个关于Chrome的开发必备小技巧[译]
谷歌Chrome,是当前最流行且被众多web开发人员使用的浏览器.最快六周就更新发布一次以及伴随着它不断强大的开发组件,使得Chrome成为你必备的开发工具.例如,在线编辑CSS,console以及d ...
- 【用户交互】APP没有退出前台但改变系统属性如何实时更新UI?监听系统广播,让用户交互更舒心~
前日,一小伙伴问我一个问题,说它解决了半天都没解决这个问题,截图如下: 大概楼主理解如下: 如果在应用中有一个判断wifi的开关和一个当前音量大小的seekbar以及一个获取当前电量多少的按钮,想知道 ...
- css样式之border-image
border-image-source 属性设置边框的图片的路径[none | <image>] div { border: 20px solid #000; border-image-s ...
- css样式之background详解
background用法详解: 1.background-color 属性设置元素的背景颜色 可能的值 color_name 规定颜色值为颜色名称的背景颜色(比如 red) he ...
- Android中通过ActionBar为标题栏添加搜索以及分享视窗
在Android3.0之后,Google对UI导航设计上进行了一系列的改革,其中有一个非常好用的新功能就是引入的ActionBar,他用于取代3.0之前的标题栏,并提供更为丰富的导航效果.Action ...
- Android中Fragment与Activity之间的交互(两种实现方式)
(未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如 ...
- 使用Hudson搭建自动构建服务器
环境: ubuntu1404_x64 说明: 使用hudson和git搭建自动构建服务器的简单示例 安装hudson及相关插件 安装hudson 安装命令如下: sudo sh -c "ec ...
- (转载) Linux IO模式及 select、poll、epoll详解
注:本文是对众多博客的学习和总结,可能存在理解错误.请带着怀疑的眼光,同时如果有错误希望能指出. 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案 ...
- 我的MYSQL学习心得(十五) 日志
我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- Jexus Web Server 完全傻瓜化图文配置教程(基于Ubuntu 12.04.3 64位)[内含Hyper-v 2012虚拟机镜像下载地址]
1. 前言 近日有感许多新朋友想尝试使用Jexus,不过绝大多数都困惑徘徊在Linux如何安装啊,如何编译Mono啊,如何配置Jexus啊...等等基础问题,于是昨日向宇内流云兄提议,不如搞几个配置好 ...

加个reset,清楚下状态。