zoukankan      html  css  js  c++  java
  • C# 线程同步之事件信号阻塞 AutoResetEvent

    AutoResetEvent可以在线程与线程间传递信号,来告知其他线程自己已经完成某一阶段的任务。

    两个AutoResetEvent实例的初始状态都是unsignaled。
    调用任何一个WaitOne都会阻塞,直到Set。

    如果初始状态(new时给了true)为Signaled,则WaitOne会立刻执行,然后自动切换回unsignaled

    AutoResetEvent采用内核时间模式,等待时间不能太长。 这能被更好的ManualResetEventslim类替换,因为它是混合模式。

    下方输出结果:

    1等待另一个线程完成工作
    2开始一个长期工作
    3工作完成
    4等待中线程完成它的工作
    5第一阶段工作完成
    6在主线程上做了些操作
    7现在开始由第二线程执行第二阶段
    8开始第二阶段
    9工作完成
    10工作全部完成

    private static AutoResetEvent _workerEvent = new AutoResetEvent(false);
    
           private static AutoResetEvent _mainEvent = new AutoResetEvent(false);
    
           static void Process(int seconds)
           {
               Console.WriteLine("2开始一个长期工作");
               Thread.Sleep(seconds);
               Console.WriteLine("3工作完成");
               Console.WriteLine("4等待中线程完成它的工作");
               _workerEvent.Set();
               _mainEvent.WaitOne();
               Console.WriteLine("8开始第二阶段");
               Thread.Sleep(seconds);
               Console.WriteLine("9工作完成");
               _workerEvent.Set();
           }
    
           static void Main(string[] args)
           {
               var t = new Thread(() => Process(10));
               t.Start();
    
               Console.WriteLine("1等待另一个线程完成工作");
               _workerEvent.WaitOne();
    
               Console.WriteLine("5第一阶段工作完成");
               Console.WriteLine("6在主线程上做了些操作");
               Thread.Sleep(5);
               Console.WriteLine("7现在开始由第二线程执行第二阶段");
               _mainEvent.Set();
               _workerEvent.WaitOne();
               Console.WriteLine("10工作全部完成");
    
               Console.ReadLine();
           }
    
  • 相关阅读:
    UWP开发之Mvvmlight实践一:如何在项目中添加使用Mvvmlight(图文详解)
    poj2909 欧拉素数筛选
    南京区域赛总结
    poj 2551 Ones
    poj 2524 Ubiquitous Religions(简单并查集)
    poj 2503 Babelfish(字典树或map或哈希或排序二分)
    poj 3080 Blue Jeans
    hdoj 4762 Cut the Cake
    linux tar.gz zip 解压缩 压缩命令
    poj 3714 寻找最近点对
  • 原文地址:https://www.cnblogs.com/oneweek/p/13620378.html
Copyright © 2011-2022 走看看