全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C#使用AutoResetEvent实现同步

前几天碰到一个线程的顺序执行的问题,就是一个异步线程往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的实现示例  # 设置为  # 三件  # 就会  # 我说  # 多个  # 不多  # 人就  # 相关资料  # 另外一个  # 请各位  # 前几天  # 人去  # 又将  # 事都  # 在等待  # 多线程  # 大家多多  # 只允许  # 不足之处  # 再往 


相关文章: Python路径拼接规范_跨平台处理说明【指导】  北京企业网站设计制作公司,北京铁路集团官方网站?  Swift开发中switch语句值绑定模式  制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  微信小程序 input输入框控件详解及实例(多种示例)  智能起名网站制作软件有哪些,制作logo的软件?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  定制建站流程步骤详解:一站式方案设计与开发指南  ,想在网上投简历,哪几个网站比较好?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  建站三合一如何选?哪家性价比更高?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  如何快速生成橙子建站落地页链接?  如何在橙子建站上传落地页?操作指南详解  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  外汇网站制作流程,如何在工商银行网站上做外汇买卖?  ,南京靠谱的征婚网站?  建站之星如何快速更换网站模板?  C#如何在一个XML文件中查找并替换文本内容  建站之星24小时客服电话如何获取?  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  自助网站制作软件,个人如何自助建网站?  ,如何利用word制作宣传手册?  沈阳制作网站公司排名,沈阳装饰协会官方网站?  如何在IIS中新建站点并配置端口与物理路径?  如何设置并定期更换建站之星安全管理员密码?  制作门户网站的参考文献在哪,小说网站怎么建立?  网站制作网站,深圳做网站哪家比较好?  个人网站制作流程图片大全,个人网站如何注销?  建站之星导航如何优化提升用户体验?  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  香港服务器租用费用高吗?如何避免常见误区?  ,怎么在广州志愿者网站注册?  Java解压缩zip - 解压缩多个文件或文件夹实例  制作网站的公司有哪些,做一个公司网站要多少钱?  建站主机默认首页配置指南:核心功能与访问路径优化  建站之星2.7模板:企业网站建设与h5定制设计专题  韩国服务器如何优化跨境访问实现高效连接?  如何选择建站程序?包含哪些必备功能与类型?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  建站之星微信建站一键生成小程序+多端营销系统  如何快速搭建高效服务器建站系统?  如何用好域名打造高点击率的自主建站?  网站网页制作专业公司,怎样制作自己的网页?  如何在宝塔面板创建新站点?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。