• (三)线程等待句柄


    (一).描述
        本示例代码实现线程等待等待执行,比如一个线程在执行之前要等待所有其它线程或某个线程
    先执行完成,或者等待其它线程至少一个执行完成.
    (二).代码
        
    using System;
        
    using System.Runtime.Remoting.Messaging;
        
    using System.Threading;

    namespace 等待句柄

     
    //委托声明(函数签名)
     delegate string MyMethodDelegate();
     
    class MyClass
     

      
    //要调用方法1
      public string Write1()
      
    {
       
    for(double i = 0; i < 100000000000;i++)  //此数值大小可以根据自己的环境修改,
                                                                     
    //目的是让此方法延长时间而已
       {
        
    //延长时间(模拟实际任务)
       }

       Console.WriteLine(
    "执行方法1");
       
    return "";
      }


      
    //要调用方法2
      public string Write2()
      
    {
       Console.WriteLine(
    "执行方法2");
       
    return "22222222222222";
      }


      
    //要调用方法3
      public string Write3()
      
    {
       Console.WriteLine(
    "执行方法3");
       
    return "33333333333333";
      }


      [STAThread]
      
    static void Main(string[] args)
      
    {
       MyClass myClass 
    = new MyClass();
       MyMethodDelegate d1 
    = new MyMethodDelegate(myClass.Write1);
       MyMethodDelegate d2 
    = new MyMethodDelegate(myClass.Write2);
       MyMethodDelegate d3 
    = new MyMethodDelegate(myClass.Write3);

       AsyncResult myResult1,myResult2,myResult3;     
    //此类封闭异步委托异步调用的结果,通过AsyncResult得到结果.
       myResult1 = (AsyncResult)d1.BeginInvoke(null,null);        //调用   
       
       myResult2 
    = (AsyncResult)d2.BeginInvoke(null,null);        
       
       myResult3 
    = (AsyncResult)d3.BeginInvoke(null,null); 

       
    //建立WaitHandle数组对象
       WaitHandle[] waitHandle = new WaitHandle[3]{myResult1.AsyncWaitHandle,myResult2.AsyncWaitHandle,myResult3.AsyncWaitHandle};

    /* 
          try
       {
        //等待三个异步方法中的至少一个执行完成,才继续执行下面的语句
        WaitHandle.WaitAny(waitHandle);
       }
       catch(Exception ex)
       {
        throw new Exception(ex.Message);
       }
    */


       myResult1.AsyncWaitHandle.WaitOne();  
    //如果当前异步方法还没有完成,此异步方法执行完毕才往下执行
       myResult2.AsyncWaitHandle.WaitOne();  
       myResult3.AsyncWaitHandle.WaitOne();

    /*
       myResult1.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(1),false); //如果当前异步方法还没有完成,则等待一秒的时间执行此方法; 如果一秒后此方法还未完成的话,则不再等待,继续往下执行
       myResult2.AsyncWaitHandle.WaitOne();  
       myResult3.AsyncWaitHandle.WaitOne();
    */
      
       
       Console.WriteLine(
    "测试等待句柄");   //标记语句用.
       Console.Read();
      }

     }

    }


  • 相关阅读:
    python目录操作【os和os.path】
    Zabbix4.0 zabbix 快速监控主机
    Zabbix 4.0 钉钉报警
    MySql:sql99语法的连接查询
    bat脚本中存在多条指令,但只执行到某条指令不继续向下执行的一种解决方法
    基类与接口类中的虚析构函数(virtual destructor)
    TortoiseGit使用指南;
    Rust编译问题Blocking waiting for file lock on package cache
    win10安装visual C++ 6.0,在最后显示安装程序正在更新您的系统,然后就无响应
    从实现装饰者模式中思考C++指针和引用的选择
  • 原文地址:https://www.cnblogs.com/engine1984/p/862972.html
Copyright © 2020-2023  润新知