欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

信号量的使用 ManualResetEvent

程序员文章站 2022-05-06 21:59: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("我吃了!");