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

posted @ 2018-07-28 11:22  ARM830  阅读(303)  评论(0编辑  收藏  举报