AutoResetEvent是.net线程简易同步方法中的一种。

AutoResetEvent 常常被用来在两个线程之间进行信号发送

两个线程共享相同的AutoResetEvent对象,线程可以通过调用AutoResetEvent对象的WaitOne()方法进入等待状态,然后另外一个线程通过调用AutoResetEvent对象的Set()方法取消等待的状态。

AutoResetEvent如何工作的

在内存中保持着一个bool值,如果bool值为False,则使线程阻塞,反之,如果bool值为True,则使线程退出阻塞。当我们创建AutoResetEvent对象的实例时,我们在函数构造中传递默认的bool值,以下是实例化AutoResetEvent的例子。

AutoResetEvent autoResetEvent = new AutoResetEvent(false);

WaitOne 方法

该方法阻止当前线程继续执行,并使线程进入等待状态以获取其他线程发送的信号。WaitOne将当前线程置于一个休眠的线程状态。WaitOne方法收到信号后将返回True,否则将返回False。

autoResetEvent.WaitOne();

WaitOne方法的第二个重载版本是等待指定的秒数。如果在指定的秒数后,没有收到任何信号,那么后续代码将继续执行。

static void ThreadMethod()
{while(!autoResetEvent.WaitOne(TimeSpan.FromSeconds(2))){Console.WriteLine("Continue");Thread.Sleep(TimeSpan.FromSeconds(1));}Console.WriteLine("Thread got signal");
}

这里我们传递了2秒钟作为WaitOne方法的参数。在While循环中,autoResetEvent对象等待2秒,然后继续执行。当线程取得信号,WaitOne返回为True,然后退出循环,打印"Thread got signal"的消息。

Set 方法

AutoResetEvent Set方法发送信号到等待线程以继续其工作,以下是调用该方法的格式。

autoResetEvent.Set();

AutoResetEvent例子

下面的例子展示了如何使用AutoResetEvent来释放线程。在Main方法中,我们用Task Factory创建了一个线程,它调用了GetDataFromServer方法。调用该方法后,我们调用AutoResetEvent的WaitOne方法将主线程变为等待状态。在调用GetDataFromServer方法时,我们调用了AutoResetEvent对象的Set方法,它释放了主线程,并控制台打印输出dataFromServer方法返回的数据。

class Program
{static AutoResetEvent autoResetEvent = new AutoResetEvent(false);static string dataFromServer = "";static void Main(string[] args){Task task = Task.Factory.StartNew(() =>{GetDataFromServer();});//Put the current thread into waiting state until it receives the signalautoResetEvent.WaitOne();//Thread got the signalConsole.WriteLine(dataFromServer);}static void GetDataFromServer(){//Calling any webservice to get dataThread.Sleep(TimeSpan.FromSeconds(4));dataFromServer = "Webservice data";autoResetEvent.Set();}
}

C# AutoResetEvent相关推荐

  1. AutoResetEvent和ManualResetEvent

    首先说说线程的终止状态和非终止状态.AutoResetEvent和ManualResetEvent的构造函数中,都有bool变量来指明线程的终止状态和非终止状态.true表示终止状态,false表示非 ...

  2. 多线程间通信之AutoResetEvent和ManualResetEvent的原理分析

    AutoResetEvent 允许线程通过发信号互相通信. 通常,当线程需要独占访问资源时使用该类. 线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号. 如果 AutoRe ...

  3. 线程同步-AutoResetEvent

    线程同步的其他方式: 1.AutoResetEvent 使用WaitOne和set 进行阻塞和释放阻塞的线程, WaitOne方法定义: public virtual bool WaitOne(int ...

  4. 【深度好文】多线程之WaitHandle--派生EventWaitHandle事件构造-》AutoResetEvent、ManualResetEvent...

    AutoResetEvent/ManualResetEvent 都是继承自 EventWaitHandle ,EventWaitHandle继承自WaitHandle. 在讨论这个问题之前,我们先了解 ...

  5. 关于AutoResetEvent 和ManualResetEvent

    在公司的代码里面看到这两个类的使用了,第一次去msdn上的时候,看的一头雾水(关键是没有找对方法) http://www.cnblogs.com/qingyun163/archive/2013/01/ ...

  6. autoresetevent java_[原创]AutoResetEvent, ManualResetEvent的Java模拟

    AutoResetEvent, ManualResetEvent是C#中常用的线程同步方法,在Java中可以模拟,AutoResetEvent使用Semaphore,增加的是许可证数量,程序里只有一个 ...

  7. c# AutoResetEvent和ManualResetEvent

    网上有很多AutoResetEvent和ManualResetEvent的详细介绍,在这里不做过多详细的解释,写下自己的一点心得留作备忘. AutoResetEvent和ManualResetEven ...

  8. ManulResetEvent与AutoResetEvent

    定义 ManualResetEvent:通知正在等待的线程已发生事件. AutoResetEvent:通知正在等待的线程已发生事件. 代码 ManualResetEvent测试 using Syste ...

  9. Thread 等待异步方法执行完成方案:AutoResetEvent.WaitOne()

    Thread 等待异步方法执行完成方案:AutoResetEvent.WaitOne() static AutoResetEvent myresetevent = new AutoResetEvent ...

最新文章

  1. leetcode算法题--完美数
  2. 数字变化滚动到指定数字的文字特效
  3. server2008中如何关闭internet explorer增强的安全配置
  4. matlab gui输入数据库,从数据库值填充Matlab GUI列表框
  5. 多个平台下使用Custom Fonts
  6. 哈夫曼编码(Huffman Coding) cpp完整代码实现 详细注释 ASCII码表
  7. python第三方插件登录网易音乐_基于 Python3 的网易云音乐下载器(支持嵌入专辑封面等 ID3-Tags 信息)...
  8. 自然常数e的由来(简单通俗易于理解自然常数e)
  9. 红米手机停在机器人这里_红米开不了机,开机画面一直显示一个米兔机器人在修理的画面...
  10. 关于监控服务器指标、CPU、内存、警报的一些解决方案
  11. oracle驱动下载地址
  12. 2020校招面试之深信服
  13. jQuery实现消息列表循环垂直向上滚动
  14. java使用三目运算符来判断成绩
  15. mongodb权限管理篇
  16. python throw_python 之 异常处理
  17. 电锯惊魂—经典的语言
  18. java中string中转义_如何在String.Format中转义%?
  19. 网易考拉规则引擎平台架构设计与实践
  20. 【Python代码基础(符号篇1)】

热门文章

  1. QT的QGraphicsAnchorLayout类的使用
  2. C语言const专题
  3. 计算机接口配件,最近发布:最新的计算机外部接口计算机主板外部接口简介计算机主板接口简介...
  4. 上海浦东新区计算机学校排名2015,2015年上海市浦东新区初级中学最新排名
  5. centos下svn安装,svn用户管理,svn用户目录管理(虚拟机下访问)
  6. 拦截器Intercepter和过滤器Filter的比较
  7. FreeMarker中assign指令的用法
  8. 数据库表的软硬关联_数据库容灾能力的探讨(一)
  9. 计算机控制试卷中南大学,期末试卷,需要的自取
  10. 深度学习数学相关知识