代码改变世界

用一个示例方法来初始理解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;
            }