全网整合营销服务商

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

免费咨询热线: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的实现示例  # 设置为  # 三件  # 就会  # 我说  # 多个  # 不多  # 人就  # 相关资料  # 另外一个  # 请各位  # 前几天  # 人去  # 又将  # 事都  # 在等待  # 多线程  # 大家多多  # 只允许  # 不足之处  # 再往 


相关文章: 公众号网站制作网页,微信公众号怎么制作?  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  如何通过IIS搭建网站并配置访问权限?  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  如何将凡科建站内容保存为本地文件?  上海网站制作开发公司,上海买房比较好的网站有哪些?  如何在香港免费服务器上快速搭建网站?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  ,网页ppt怎么弄成自己的ppt?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  网站制作难吗安全吗,做一个网站需要多久时间?  高防服务器:AI智能防御DDoS攻击与数据安全保障  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  如何通过cPanel快速搭建网站?  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  如何快速搭建高效WAP手机网站吸引移动用户?  网站好制作吗知乎,网站开发好学吗?有什么技巧?  名字制作网站免费,所有小说网站的名字?  如何基于云服务器快速搭建网站及云盘系统?  常州自助建站费用包含哪些项目?  网站制作的步骤包括,正确网址格式怎么写?  建站之星与建站宝盒如何选择最佳方案?  平台云上自主建站:模板化设计与智能工具打造高效网站  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  建站主机类型有哪些?如何正确选型  如何在宝塔面板创建新站点?  建站之星如何取消后台验证码生成?  如何通过商城免费建站系统源码自定义网站主题?  如何通过山东自助建站平台快速注册域名?  制作表格网站有哪些,线上表格怎么弄?  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  建站主机选购指南与交易推荐:核心配置解析  桂林网站制作公司有哪些,桂林马拉松怎么报名?  MySQL查询结果复制到新表的方法(更新、插入)  如何在IIS中配置站点IP、端口及主机头?  天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?  开心动漫网站制作软件下载,十分开心动画为何停播?  建站之星后台管理系统如何操作?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  如何在宝塔面板中创建新站点?  专业网站建设制作报价,网页设计制作要考什么证?  如何高效生成建站之星成品网站源码?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  如何用5美元大硬盘VPS安全高效搭建个人网站? 

您的项目需求

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