• 用一个示例方法来初始理解ManualResetEvent的用法。


     [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;
                }
  • 相关阅读:
    Java异常简介
    Java中的接口
    Java中的抽象类
    Java的多态
    关于this
    面向对象的继承方式详解
    1像素边框问题
    HTML5之本地存储SessionStorage
    js数组去重的4个方法
    前端模块化
  • 原文地址:https://www.cnblogs.com/atwind/p/2975746.html
Copyright © 2020-2023  润新知