最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
C#使用AutoResetEvent实现同步
时间:2017-08-02 编辑:简简单单 来源:一聚教程网
前几天碰到一个线程的顺序执行的问题,就是一个异步线程往A接口发送一个数据请求。另外一个异步线程往B接口发送一个数据请求,当A和B都执行成功了,再往C接口发送一个请求。说真的,一直做BS项目,对线程了解,还真不多。就知道AutoResetEvent这个东西和线程有关,用于处理线程切换之类,于是决定用AutoResetEvent来处理上面的问题。
于是网上查找相关资料:
原来,AutoResetEvent在.Net多线程编程中经常用到。当某个线程调用WaitOne方法后,信号处于发送状态,该线程会得到信号, 程序就会继续向下执行,否则就等待。而且 AutoResetEvent.WaitOne()每次只允许一个线程进入,当某个线程得到信号后,AutoResetEvent会自动又将信号置为不发送状态,其他调用WaitOne的线程只有继续等待.也就是说,AutoResetEvent一次只唤醒一个线程,其他线程还是堵塞。
简介
AutoResetEvent(bool initialState):构造函数,用一个指示是否将初始状态设置为终止的布尔值初始化该类的新实例。
false:无信号,子线程的WaitOne方法不会被自动调用
true:有信号,子线程的WaitOne方法会被自动调用
Reset ():将事件状态设置为非终止状态,导致线程阻止;如果该操作成功,则返回true;否则,返回false。
Set ():将事件状态设置为终止状态,允许一个或多个等待线程继续;如果该操作成功,则返回true;否则,返回false。
WaitOne(): 阻止当前线程,直到收到信号。
WaitOne(TimeSpan, Boolean) :阻止当前线程,直到当前实例收到信号,使用 TimeSpan 度量时间间隔并指定是否在等待之前退出同步域。
WaitAll():等待全部信号。
实现
代码如下 | 复制代码 |
classProgram {
staticvoidMain() { Request req =newRequest();
//这个人去干三件大事 Thread GetCarThread =newThread(newThreadStart(req.InterfaceA)); GetCarThread.Start();
Thread GetHouseThead =newThread(newThreadStart(req.InterfaceB)); GetHouseThead.Start();
//等待三件事都干成的喜讯通知信息 AutoResetEvent.WaitAll(req.autoEvents);
//这个人就开心了。 req.InterfaceC();
System.Console.ReadKey(); } }
publicclassRequest { //建立事件数组 publicAutoResetEvent[] autoEvents =null;
publicRequest() { autoEvents =newAutoResetEvent[] { newAutoResetEvent(false), newAutoResetEvent(false) }; }
publicvoidInterfaceA() { System.Console.WriteLine("请求A接口");
Thread.Sleep(1000*2);
autoEvents[0].Set();
System.Console.WriteLine("A接口完成"); }
publicvoidInterfaceB() { System.Console.WriteLine("请求B接口");
Thread.Sleep(1000 * 1);
autoEvents[1].Set();
System.Console.WriteLine("B接口完成"); }
publicvoidInterfaceC() { System.Console.WriteLine("两个接口都已经请求完,正在处理C"); } } |
注意,WaitOne 或是WaitAll 最好都加上超时时间。否则没有收到信号,线程一直会阻塞。
后话
这个只是上面的场景的一个简化,主要是用来解决刚刚我说的那个场景的问题。
以上是自己对AutoResetEvent的使用总结。不足之处请各位指点一二。
相关文章
- C#复制数组的两种方式及效率比较解读 10-24
- ASP.NET Identity用法解析 10-24
- ASP.NET MVC使用Identity增删改查用户介绍 10-24
- C语言中atoi函数模拟实现介绍 10-18
- .Net反向代理组件Yarp用法介绍 10-10
- .NET使用YARP通过编码方式配置域名转发实现反向代理教程 10-10