zoukankan      html  css  js  c++  java
  • 《C#多线程编程实战》2.5 AutoResetEvent

    这个有点像是缩小版的mutex

    还是很好理解的

    相对mutex 使用的范围可能比较小一点。

     class Program
        {
            static AutoResetEvent work = new AutoResetEvent(false);
            static AutoResetEvent main = new AutoResetEvent(false);
            static void P(int s)
            {
                Console.WriteLine($"第二线程要等待{s}");
                Thread.Sleep(TimeSpan.FromSeconds(s));
                Console.WriteLine("第二线程等待结束");
                work.Set();//告诉work 不用等待
                Console.WriteLine("等待主线程完成工作");
                main.WaitOne();//main 堵塞
                Thread.Sleep(TimeSpan.FromSeconds(s));
                Console.WriteLine("第二线程结束");
                work.Set();//不用等待
            }
            static void Main(string[] args)
            {
                var t = new Thread(() => P(10));
                t.Start();
                Console.WriteLine($"等待别的线程完成工作");
                work.WaitOne();//设置work等待 
                Console.WriteLine("设置work线程等待");
                Thread.Sleep(TimeSpan.FromSeconds(5));
                Console.WriteLine("主线程等待5s 已经结束");
                main.Set();//告诉main 不用等待
                work.WaitOne();//告诉 work要等待
                Console.WriteLine("主线程结束");
                Console.ReadKey();
            }
        }

     一般来说就是

    在实例化的时候,要设置为false  如果为true 那waiteone就不会有效果。

    其次 waiteone就是要堵塞,等待。

    set就是发出解锁信号,让AutoResetEvent不再等待。

    也是非常好理解的。

    下面的例子是当实例化时 传入true时 为何waiteOne不再起效

    static AutoResetEvent main = new AutoResetEvent(true);
    
    static void Main(string[] args)
            {
               if( main.WaitOne(5000, false))
                {
                    Console.WriteLine("如果实例化AutoRecstEnvet向构造函数中传递true时 WaiteOne不会等待");
                }
               else
                {
                    main.Set();
                    Console.WriteLine("所以直接解锁");
                }
                Console.ReadKey();
            }

    也就是当 实例化为true waiteone第一次时无法起效。

    剩下的用法语也是相当简单的。

    不过这个AutoResetEvent是无法用到进程之间的。

    而且学习这个可以有助于理解Metux 的使用方式。

  • 相关阅读:
    021.day21 反射 Class类 反射常用操作
    020.day20 线程概述 多线程优缺点 线程的创建 线程常用方法 生命周期 多线程同步
    019.day19 缓冲流 对象流 标准输入输出流
    018.day18 map集合如何实现排序 File类 IO流 字节流 字符流 编码
    017.day17 Map接口 克隆 treeSet集合排重缺陷
    016.day16 HashSet TreeSet 比较器Comparable Comparator
    015.day15
    014.day14
    013.day13
    线程
  • 原文地址:https://www.cnblogs.com/T-ARF/p/9381309.html
Copyright © 2011-2022 走看看