zoukankan      html  css  js  c++  java
  • 用一个示例方法来初始理解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;
                }
  • 相关阅读:
    算术异常
    MySQL和Oracle的区别
    string常用方法
    io异常
    关于null和空指针异常
    string的一些特殊点
    Mybatis中的动态SQL
    ORM框架的概述
    朴素贝叶斯分类器
    正则表达式
  • 原文地址:https://www.cnblogs.com/atwind/p/2975746.html
Copyright © 2011-2022 走看看