AutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源。

线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程 通过调用 Set 发出资源可用的信号。

调用 Set 向 AutoResetEvent 发信号以释放等待线程。AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止状态。如果没有任何线程在等待,则状态将无限期地保持为终止状态。

可以通过将一个布尔值传递给构造函数来控制 AutoResetEvent 的初始状态,如果初始状态为终止状态,则为 true;否则为 false。

通俗的来讲只有等myResetEven.Set()成功运行后,myResetEven.WaitOne()才能够获得运行机会;Set是发信号,WaitOne是等待信号,只有发了信号, 等待的才会执行。如果不发的话,WaitOne后面的程序就永远不会执行。

使用场景:需要严格按照执行顺序来执行。比如等待一个算法函数运行完出结果后,根据结果值执行下面程序。

可以用使用myResetEven.Close()(释放由当前 WaitHandle 占用的所有资源。);释放所有的myResetEven.WaitOne()。

如果再次使用需要myResetEvent=new AutoResetEvent(false),重新定义。

下面例子,按照“购买饮料,投币线程,取饮料线程”顺序来执行。

static AutoResetEvent payResetEvent = new AutoResetEvent(false);
static AutoResetEvent getRessetEvent = new AutoResetEvent(false);
const int times = ;
static int threadNumber = ;
private void button1_Click(object sender, EventArgs e)
{
Thread payThread = new Thread(new ThreadStart(PayMoney));
payThread.Name = " 投币线程"; Thread getThread = new Thread(new ThreadStart(GetDrink));
getThread.Name = " 取饮料线程"; payThread.Start();
getThread.Start(); for (int i = ; i <= times; i++)
{
threadNumber = i;
Console.WriteLine(" 购买饮料:编号{0}", i); payResetEvent.Set();
Thread.Sleep();//加上睡眠时间让PayMoney执行完 getRessetEvent.Set();
Thread.Sleep();
} payThread.Abort();
getThread.Abort(); }
static void PayMoney()
{
while (true)
{
payResetEvent.WaitOne();
//myResetEvent.Reset();
Console.WriteLine("{0}:编号{1}", Thread.CurrentThread.Name, threadNumber);
}
}
static void GetDrink()
{
while (true)
{
getRessetEvent.WaitOne();
Console.WriteLine("{0}:编号{1}", Thread.CurrentThread.Name, threadNumber);
Console.WriteLine("------------------------------------------");
Thread.Sleep();
}
}

执行结果:

购买饮料:编号1
 投币线程:编号1
 取饮料线程:编号1
------------------------------------------
 购买饮料:编号2
 投币线程:编号2
 取饮料线程:编号2
------------------------------------------
 购买饮料:编号3
 投币线程:编号3
 取饮料线程:编号3
------------------------------------------
 购买饮料:编号4
 投币线程:编号4
 取饮料线程:编号4
------------------------------------------

C# AutoResetEvent 使用整理的更多相关文章

  1. [WF4.0 实战] AutoResetEvent具体解释(线程独占訪问资源)

    由来: 在学习工作流的过程中,宿主程序中会出现这么一段代码: staticAutoResetEvent instanceUnloaded = new AutoResetEvent(false); 然后 ...

  2. dotNET跨平台相关文档整理

    一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...

  3. UWP学习目录整理

    UWP学习目录整理 0x00 可以忽略的废话 10月6号靠着半听半猜和文字直播的补充看完了微软的秋季新品发布会,信仰充值成功,对UWP的开发十分感兴趣,打算后面找时间学习一下.谁想到学习的欲望越来越强 ...

  4. SQL Server 常用内置函数(built-in)持续整理

    本文用于收集在运维中经常使用的系统内置函数,持续整理中 一,常用Metadata函数 1,查看数据库的ID和Name db_id(‘DB Name’),db_name('DB ID') 2,查看对象的 ...

  5. kafka学习笔记:知识点整理

    一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...

  6. JAVA程序员常用软件整理下载

    ********为了大家学习方便,特意整理软件下载如下:*************Java类软件:-------------------------------JDK7.0:http://pan.ba ...

  7. js数组学习整理

    原文地址:js数组学习整理 常用的js数组操作方法及原理 1.声明数组的方式 var colors = new Array();//空的数组 var colors = new Array(3); // ...

  8. C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEvent

    看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex S ...

  9. GJM : C#设计模式汇总整理——导航 【原创】

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

随机推荐

  1. 快速傅里叶变换(Fast Fourier Transform, FFT)和短时傅里叶变换(short-time Fourier transform,STFT )【资料整理】【自用】

    1. 官方形象展示FFT:https://www.bilibili.com/video/av19141078/?spm_id_from=333.788.b_636f6d6d656e74.6 2. 讲解 ...

  2. mongoDB与mongoose

    mongodb是一个基于分布式文件存储的文档型数据库 MongoDB 是一个介于关系数据库和非关系数据库之间的产品 MongoDB 最大的特点是他支持的查询语言非常强大,而且还支持对数据建立索引 官方 ...

  3. 新SQL temp

    select a.createtime, -- 日期 dept.name as deptName, -- 科室 (select t.docname from ( SELECT u.clinic_id ...

  4. ****** 五十 ******、软设笔记【UML分析和意义】-类图、对象图、状态图、活动图、顺序图、协作图、构件图、部署图,动静态模式

    一.类图(Class Diagram) 描述一组类.接口.协作已经它们之间的图,用来显示系统中各个类的静态结构图. 类之间的关系(relationship) *依赖(dependency) *泛化(g ...

  5. 判断质数(Java)

    package day01; //输出1-100中质数,并且每十个换行 public class PrimeNum { public static void main(String[] args) { ...

  6. IDApython教程(一)

    IDAPython是IDA的一个功能强大的扩展特性,对外提供了大量的IDA API调用.另外,还能在使用python 脚本语言的过程中获得能力提升,所以我强烈推荐所有的逆向工程师使用它. 然而不幸的是 ...

  7. cuda、cuDNN的相关内容

    1.nvidia与cuda需要满足关系: https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html/ 2.cuda与cudn ...

  8. redis踩坑记录

    1. 关于redis启动后的warnning: WARNING you have Transparent Huge Pages (THP) support enabled in your kernel ...

  9. CDH5.12安装检查Inspector failed on the following hosts...

    1 安装检查报错 2 原因是因为自己的文件没有全部同步过去 hadoop003文件下面缺少了cm文件夹的内容 3 cp过去 scp -r cm root@hadoop003:/var/www/html ...

  10. 🌵react小记 🌵