博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# AutoResetEvent
阅读量:5291 次
发布时间:2019-06-14

本文共 1971 字,大约阅读时间需要 6 分钟。

文章转载自:

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

AutoResetEvent是.net线程简易同步方法中的一种,两个线程共享相同的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 signal        autoResetEvent.WaitOne();         //Thread got the signal        Console.WriteLine(dataFromServer);    }     static void GetDataFromServer()    {        //Calling any webservice to get data        Thread.Sleep(TimeSpan.FromSeconds(4));        dataFromServer = "Webservice data";        autoResetEvent.Set();    }}

转载于:https://www.cnblogs.com/lyh523329053/p/9815517.html

你可能感兴趣的文章
前台通过window.localStorage存储用户名
查看>>
基于Flutter实现的仿开眼视频App
查看>>
析构器
查看>>
驱动的本质
查看>>
Swift的高级分享 - Swift中的逻辑控制器
查看>>
https通讯流程
查看>>
Swagger简单介绍
查看>>
C# 连接SQLServer数据库自动生成model类代码
查看>>
关于数据库分布式架构的一些想法。
查看>>
BigDecimal
查看>>
Python语法基础之DataFrame
查看>>
Python语法基础之对象(字符串、列表、字典、元组)
查看>>
大白话讲解 BitSet
查看>>
sql语句中where与having的区别
查看>>
Python数据分析入门案例
查看>>
0x7fffffff的意思
查看>>
Java的值传递和引用传递
查看>>
HTML5的服务器EventSource(server-sent event)发送事件
查看>>
vue-devtools 获取到 vuex store 和 Vue 实例的?
查看>>
检查 chrome 插件是否存在
查看>>