全网整合营销服务商

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

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


相关文章: 如何快速生成可下载的建站源码工具?  如何快速打造个性化非模板自助建站?  Android滚轮选择时间控件使用详解  如何在云指建站中生成FTP站点?  建站主机服务器选型指南与性能优化方案解析  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  ,网站推广常用方法?  如何通过云梦建站系统实现SEO快速优化?  香港服务器如何优化才能显著提升网站加载速度?  设计网站制作公司有哪些,制作网页教程?  制作证书网站有哪些,全国城建培训中心证书查询官网?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  建站10G流量真的够用吗?如何应对访问高峰?  平台云上自主建站:模板化设计与智能工具打造高效网站  如何选择高效可靠的多用户建站源码资源?  *服务器网站为何频现安全漏洞?  如何在阿里云高效完成企业建站全流程?  建站之星CMS五站合一模板配置与SEO优化指南  如何在万网主机上快速搭建网站?  如何安全更换建站之星模板并保留数据?  重庆网站制作公司哪家好,重庆中考招生办官方网站?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  Swift开发中switch语句值绑定模式  ,sp开头的版面叫什么?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  如何使用Golang table-driven基准测试_多组数据测量函数效率  建站主机是否等同于虚拟主机?  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  宝塔建站教程:一键部署配置流程与SEO优化实战指南  广州建站公司哪家好?十大优质服务商推荐  如何在腾讯云免费申请建站?  贸易公司网站制作流程,出口贸易网站设计怎么做?  C#怎么创建控制台应用 C# Console App项目创建方法  如何通过免费商城建站系统源码自定义网站主题与功能?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  小程序网站制作需要准备什么资料,如何制作小程序?  c# 在高并发场景下,委托和接口调用的性能对比  如何通过远程VPS快速搭建个人网站?  如何通过老薛主机一键快速建站?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  如何在西部数码注册域名并快速搭建网站?  如何选择建站程序?包含哪些必备功能与类型?  香港服务器WordPress建站指南:SEO优化与高效部署策略  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  PHP正则匹配日期和时间(时间戳转换)的实例代码  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  网站制作企业,网站的banner和导航栏是指什么?  建站主机空间推荐 高性价比配置与快速部署方案解析  专业网站建设制作报价,网页设计制作要考什么证? 

您的项目需求

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