前几天碰到一个线程的顺序执行的问题,就是一个异步线程往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():等待全部信号。
实现
class Program
{
static void Main()
{
Request req = new Request();
//这个人去干三件大事
Thread GetCarThread = new Thread(new ThreadStart(req.InterfaceA));
GetCarThread.Start();
Thread GetHouseThead = new Thread(new ThreadStart(req.InterfaceB));
GetHouseThead.Start();
//等待三件事都干成的喜讯通知信息
AutoResetEvent.WaitAll(req.autoEvents);
//这个人就开心了。
req.InterfaceC();
System.Console.ReadKey();
}
}
public class Request
{
//建立事件数组
public AutoResetEvent[] autoEvents = null;
public Request()
{
autoEvents = new AutoResetEvent[]
{
new AutoResetEvent(false),
new AutoResetEvent(false)
};
}
public void InterfaceA()
{
System.Console.WriteLine("请求A接口");
Thread.Sleep(1000*2);
autoEvents[0].Set();
System.Console.WriteLine("A接口完成");
}
public void InterfaceB()
{
System.Console.WriteLine("请求B接口");
Thread.Sleep(1000 * 1);
autoEvents[1].Set();
System.Console.WriteLine("B接口完成");
}
public void InterfaceC()
{
System.Console.WriteLine("两个接口都已经请求完,正在处理C");
}
}
注意,WaitOne 或是WaitAll 最好都加上超时时间。否则没有收到信号,线程一直会阻塞。
后话
这个只是上面的场景的一个简化,主要是用来解决刚刚我说的那个场景的问题。
以上是自己对AutoResetEvent的使用总结。不足之处请各位指点一二。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# C#
# AutoResetEvent
# 同步
# C#中多线程ManualResetEvent 与 AutoResetEvent 区别
# C# AutoResetEvent的具体使用方法
# C#中AutoResetEvent控制线程用法小结
# C#多线程之线程通讯(AutoResetEvent)
# C# ManualResetEvent用法详解
# C# ManualResetEvent使用方法详解
# C#中ManualResetEvent用法详解
# C# AutoResetEvent和ManualResetEvent的实现示例
# 设置为
# 三件
# 就会
# 我说
# 多个
# 不多
# 人就
# 相关资料
# 另外一个
# 请各位
# 前几天
# 人去
# 又将
# 事都
# 在等待
# 多线程
# 大家多多
# 只允许
# 不足之处
# 再往
相关文章:
如何通过VPS建站无需域名直接访问?
如何在建站之星绑定自定义域名?
建站之星多图banner生成与模板自定义指南
广州商城建站系统开发成本与周期如何控制?
定制建站流程步骤详解:一站式方案设计与开发指南
如何快速生成凡客建站的专业级图册?
宝盒自助建站智能生成技巧:SEO优化与关键词设置指南
番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?
如何选择靠谱的建站公司加盟品牌?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
建站VPS推荐:2025年高性能服务器配置指南
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
中山网站制作网页,中山新生登记系统登记流程?
如何设计高效校园网站?
如何配置WinSCP新建站点的密钥验证步骤?
如何快速生成ASP一键建站模板并优化安全性?
网站制作壁纸教程视频,电脑壁纸网站?
完全自定义免费建站平台:主题模板在线生成一站式服务
建站之星后台密码遗忘如何找回?
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
如何高效搭建专业期货交易平台网站?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
如何快速选择适合个人网站的云服务器配置?
建站之星图片链接生成指南:自助建站与智能设计教程
建站主机数据库如何配置才能提升网站性能?
如何快速上传建站程序避免常见错误?
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
在线制作视频网站免费,都有哪些好的动漫网站?
寿县云建站:智能SEO优化与多行业模板快速上线指南
开心动漫网站制作软件下载,十分开心动画为何停播?
,巨量百应是干嘛的?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
如何在阿里云香港服务器快速搭建网站?
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
如何在腾讯云免费申请建站?
网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
seo网站制作优化,网站SEO优化步骤有哪些?
建站之星各版本价格是多少?
如何零成本快速生成个人自助网站?
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
ppt制作免费网站有哪些,ppt模板免费下载网站?
如何快速搭建高效可靠的建站解决方案?
大型企业网站制作流程,做网站需要注册公司吗?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
如何快速打造个性化非模板自助建站?
,网页ppt怎么弄成自己的ppt?
整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?
建站之星如何取消后台验证码生成?
*请认真填写需求信息,我们会在24小时内与您取得联系。