Loading

ManualResetEvent

1.ManualResetEvent

  ManualResetEvent用于多线程之间信号处理。通过ManualResetEvent对象的WaitOne方法,线程进入等待/阻塞状态,线程等待信号量。线程执行set方法发初信号量,阻塞的线程进入运行状态。

  ManualResetEvent持有一个bool变量,当初始化为false时,调用waitone线程进入等待状态,等待信号量。如果设置为true线程不会阻塞。

   

    class Program
    {
        static EventWaitHandle autoResetEvent = new ManualResetEvent(false);
        static void Main(string[] args)
        {
            Task taskA = Task.Factory.StartNew(() =>
            {
                Console.WriteLine("客户1在排队等待付钱...");
                autoResetEvent.WaitOne();
                Console.WriteLine("通知来了,客户1付钱");
            }
            );
            Task task2 = Task.Factory.StartNew(() =>
            {
                Console.WriteLine("客户2在排队等待付钱...");
                autoResetEvent.WaitOne();
                Console.WriteLine("通知来了,客户2付钱");
            });
            autoResetEvent.Set();
            Console.ReadKey();
        }

    }

     结果: 

  ManualResetEvent.reset方法重新阻塞线程。

 

    class Program
    {
        static EventWaitHandle autoResetEvent = new ManualResetEvent(false);
        static void Main(string[] args)
        {
            Task taskA = Task.Factory.StartNew(() =>
            {
                Console.WriteLine("客户1在排队等待付钱...");
                autoResetEvent.WaitOne();
                Console.WriteLine("通知来了,客户1付钱");
            }
            );
            Task task2 = Task.Factory.StartNew(() =>
            {
                Console.WriteLine("客户2在排队等待付钱...");
                autoResetEvent.WaitOne();
                Thread.Sleep(5000);
                Console.WriteLine("通知来了,客户2付钱");
            });
            autoResetEvent.Set();
            Thread.Sleep(TimeSpan.FromSeconds(2));
            autoResetEvent.Reset();
            Console.ReadKey();
        }

    }

客户2的付钱阻塞。

posted @ 2018-12-04 19:51  奔跑石头  阅读(380)  评论(0)    收藏  举报