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. 在讨论这个问题之前,我们先了解 ...
随机推荐
- ASP.NET Core 中文文档 第四章 MVC(4.2)控制器操作的路由
原文:Routing to Controller Actions 作者:Ryan Nowak.Rick Anderson 翻译:娄宇(Lyrics) 校对:何镇汐.姚阿勇(Dr.Yao) ASP.NE ...
- FullCalendar应用——整合农历节气和节日
FullCalendar用来做日程管理功能非常强大,但是唯一不足的地方是没有将中国农历历法加进去,今天我将结合实例和大家分享如何将中国农历中的节气和节日整合到FullCalendar中,从而增强其实用 ...
- 《动手实现一个网页加载进度loading》
loading随处可见,比如一个app经常会有下拉刷新,上拉加载的功能,在刷新和加载的过程中为了让用户感知到 load 的过程,我们会使用一些过渡动画来表达.最常见的比如"转圈圈" ...
- 如何使用本地账户"完整"安装 SharePoint Server 2010+解决“New-SPConfigurationDatabase : 无法连接到 SharePoint_Config 的 SQL Server 的数据 库 master。此数据库可能不存在,或当前用户没有连接权限。”
注:目前看到的解决本地账户完整安装SharePoint Server 2010的解决方案如下,但是,有但是的哦: 当我们选择了"完整"模式安装SharePointServer201 ...
- 关于sql server 2005存储过程的写法
打开数据库的SQL Server Managerment Studio---->数据库----->打开数据库会看见"可编程行"------->打开有存储过程--- ...
- Linux实战教学笔记07:Linux系统目录结构介绍
第七节 Linux系统目录结构介绍 标签(空格分隔):Linux实战教学笔记 第1章 前言 windows目录结构 C:\windows D:\Program Files E:\你懂的\精品 F:\你 ...
- 12个小技巧,让你高效使用Eclipse
集成开发环境(IDE)让应用开发更加容易.它们强调语法,让你知道是否你存在编译错误,在众多的其他事情中允许你单步调试代码.像所有的IDE一 样,Eclipse也有快捷键和小工具,这些会让您感觉轻松许多 ...
- [.NET领域驱动设计实战系列]专题二:结合领域驱动设计的面向服务架构来搭建网上书店
一.前言 在前面专题一中,我已经介绍了我写这系列文章的初衷了.由于dax.net中的DDD框架和Byteart Retail案例并没有对其形成过程做一步步分析,而是把整个DDD的实现案例展现给我们,这 ...
- Leetcode 笔记 101 - Symmetric Tree
题目链接:Symmetric Tree | LeetCode OJ Given a binary tree, check whether it is a mirror of itself (ie, s ...
- 【转】java.util.Arrays.asList 的用法
DK 1.4对java.util.Arrays.asList的定义,函数参数是Object[].所以,在1.4中asList()并不支持基本类型的数组作参数. JDK 1.5中,java.util.A ...

加个reset,清楚下状态。