用一个示例方法来初始理解ManualResetEvent的用法。
2013-03-22 15:53 咒语 阅读(495) 评论(0) 编辑 收藏 举报[Test] public void ResetEventTest() { var allDone = new ManualResetEvent(false); var i = 0; Console.WriteLine("开始循环。"); ThreadPool.QueueUserWorkItem((x) => { while (i < 5) { i++; Thread.Sleep(1000); Console.WriteLine("循环【{0}】休眠结束", i); } allDone.Set(); //结束循环,可以从WaitOne处开始后续执行了 }); Console.WriteLine("开始等待"); allDone.WaitOne(); Console.WriteLine("收到了Set的通知,可以后续进行了."); }
上面的就不多解释了,自已动手看看执行结果,比说有用得多。
有时我们要在同步返回的方法中等待异步(或踪事件)的返回结果,那么除了循环等待外,还可以这样实现:
public virtual ActionResultWrap Request<T>(string cmdName,T param ) { allDone.Reset(); //重置,以下方法等待返回中 //var hasReturn = false; var wrap = new ActionResultWrap(); ReceiveWrap = (x) => { wrap = x; //hasReturn = true; allDone.Set(); }; var swrap = new DatagramWrap(); Send(swrap.ToBson(cmdName, param)); allDone.WaitOne(); ////这个就是循环等待的方法了 //while (!hasReturn) //{ // Thread.Sleep(20); //} return wrap; }