信号量的使用 ManualResetEvent

时间:2021-05-13 15:15:17

线程的等待时可以用这个,不论是线程池还是线程都可以用这个做等待。


ManualResetEvent md=new ManualResetEvent(false);//这个false 设置线程等待, true 允许线程不待等
IAsyncResult result= new Action<string>((t) =>
            {
                Console.WriteLine(t);
                mre.Set();//允许线程不用继续等待,可以执行下去
            }).BeginInvoke("你好",null,null);
            mre.WaitOne();//主线程被卡在这里,等待信号量变成true(mre.Set()这个方法后就可变为true不用等待)
            Console.WriteLine("你吃饭了么!");
            mre.Reset();//重新设为线程等待

            IAsyncResult result01= new Action<string>((t) =>
            {
                Console.WriteLine(t);
                mre.Set();//设置线程不用继续等待,可以执行下去
            }).BeginInvoke("还没吃",null,null);
            mre.WaitOne();//又被阻塞了
            Console.WriteLine("一起吃饭吧!");
//输出结果
你好
你吃饭了么!
还没吃
一起吃饭吧!

//线程池中的使用
 mre.Reset();
            ThreadPool.QueueUserWorkItem((t) =>
            {
                Console.WriteLine("我是从线程池中走出的线程!");
                mre.Set();
            });
            mre.WaitOne();

当然也可以用循环待等的执行的方式进行线程待等

 while (!result.IsCompleted)
            {
                Thread.Sleep(500);
                Console.WriteLine("我在等你回复!");
                
            }
  Console.WriteLine("我吃了!");