AutoResetEvent 允许线程通过发信号互相通信。 通常,当线程需要独占访问资源时使用该类。

线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。 如果 AutoResetEvent 为非终止状态,则线程会被阻止,并等待当前控制资源的线程通过调用 Set 来通知资源可用。

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

AutoResetEvent.WaitOne()每次只允许一个线程进入,当某个线程得到信号后,AutoResetEvent会自动又将信号置为不发送状态,则其他调用WaitOne的线程只有继续等待.也就是说,AutoResetEvent一次只唤醒一个线程.

 static AutoResetEvent a = new AutoResetEvent(false);//WaitOne会阻止false,但是不会阻止true,内部自动reset了public static void MainTest(){Thread[] ths = new Thread[4];for (int i = 0; i < 4; i++){ths[i] = new Thread(increaseCount);ths[i].Start();}
            a.Set();//如果是非终止状态,一定要在这里Set下,不然线程一直处于等待状态System.Console.ReadKey();}static void increaseCount(){a.WaitOne();//当得到信号后,内部又将状态设置为非终止状态,相当于独占了。Random ran = new Random();Thread.Sleep(ran.Next(100, 5000));int beginNum = SharedResource1.Count;System.Console.WriteLine("线程 {0} 读到的起始值为 {1}  ", Thread.CurrentThread.ManagedThreadId, beginNum);for (int i = 0; i < 10000; i++){beginNum++;}SharedResource1.Count = beginNum;System.Console.WriteLine("线程 {0} 结束,SharedResource.Count={1}", Thread.CurrentThread.ManagedThreadId, SharedResource1.Count);a.Set();}}class SharedResource1{public static int Count = 0;    }

C# 使用AutoResetEvent进行线程同步相关推荐

  1. 线程同步-AutoResetEvent

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

  2. C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent

    C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent 本章概要: 1:终止状态和非终止状态 2:AutoResetEvent和ManualResetE ...

  3. 改善C#程序的建议6:在线程同步中使用信号量

    所谓线程同步,就是多个线程之间在某个对象上执行等待(也可理解为锁定该对象),直到该对象被解除锁定.C#中对象的类型分为引用类型和值类型.CLR在这两种类型上的等待是不一样的.我们可以简单的理解为在CL ...

  4. C#线程同步的几种方法

    在网上也看过一些关于线程同步的文章,其实线程同步有好几种方法,下面我就简单的做一下归纳. 一.volatile关键字 volatile是最简单的一种同步方法,当然简单是要付出代价的.它只能在变量一级做 ...

  5. C#中的线程(二) 线程同步基础

    1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...

  6. C#多线程编程实战(二):线程同步

    2.1 简介 竞争条件:多个线程同时使用共享对象.需要同步这些线程使得共享对象的操作能够以正确的顺序执行 线程同步问题:多线程的执行并没有正确的同步,当一个线程执行递增和递减操作时,其他线程需要依次等 ...

  7. 细说C#多线程那些事 - 线程同步和多线程优先级

    上个文章分享了一些多线程的一些基础的知识,今天我们继续学习. 一.Task类 上次我们说了线程池,线程池的QueueUserWorkItem()方法发起一次异步的线程执行很简单 但是该方法最大的问题是 ...

  8. 多线程(6)线程同步

    使用多线程很容易,但是如果多个线程同时访问一个共享资源时而不加以控制,就会导致数据损坏.所以多线程并发时,必须要考虑线程同步(或称线程安全)的问题.  什么是线程同步 多个线程同时访问共享资源时,使多 ...

  9. C#中的多线程-线程同步基础 (控制线程数量)

    同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具: 简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程完成 锁系统 构成 目的 跨进程? 速度 loc ...

最新文章

  1. pygame做一个简单的打字游戏
  2. IBM Watson将成为失败的投资?分析师眼里, IBM AI过度乐观, 夸大宣传
  3. jqurey操作select 语法解释
  4. IBM一周内拥有10万Lotus Symphony用户
  5. java泛型反映调用方法体内类型引用问题
  6. 用javascript自制ctf词频分析工具
  7. Codeforces Round #554 (Div. 2) C. Neko does Maths (数论 GCD(a,b) = GCD(a,b-a))
  8. 2019蓝桥杯省赛b组
  9. NIOS2-IDE环境下的一些操作技巧
  10. Boolean.getBoolean()和Boolean.parseBoolean()
  11. 【软件使用技巧】一(截图)
  12. 知识图谱 - 知识体系构建与知识融合
  13. Android编译libjpeg-turbo so高效压缩图片
  14. c语言 画图软件哪个好,电脑画图软件推荐
  15. 夜神模拟器android版本修改器,夜神模拟器怎么用 夜神安卓模拟器使用方法大大全...
  16. 【今日CV 计算机视觉论文速览】Wed, 27 Feb 2019
  17. 预测房价实验-房价数据集
  18. Git 团队协作机制
  19. opencc对文档的繁体中文转换为简体
  20. 一文读懂 HTTP(超文本传输)协议

热门文章

  1. java 学习之List 的 add 与set方法区别
  2. oracle ORA-00001 违反唯一约束条件 SYS_C009225问题
  3. 开发人员最佳配色主题
  4. Linux文件权限的解析
  5. 在 Docker 中使用 mysql 的一些技巧
  6. ettercap dns_spoof
  7. MD5,SHA-1,SHA-256摘要加解密
  8. Linux环境Eclipse + Tomcat + MySQL 构造J2EE方法开发环境
  9. 用 bmon 实时查看网络流量
  10. VC++6.0快捷键