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 的使用方式。

  • 相关阅读:
    [Delphi]ListView基本用法大全
    Delphi 数据类型列表
    什么是堆、栈?
    使用钩子函数[1]
    邻道干扰
    内存管理[1]
    c#中复制类提示“Resource”参数不支持重复项的解决办法
    转帖:IE对话框showModalDialog(模态)和showModelessDialog
    今日工作心得:一段用于验证的jQuery代码
    每个开发人员现在应该下载的十种必备工具
  • 原文地址:https://www.cnblogs.com/T-ARF/p/9381309.html
Copyright © 2011-2022 走看看