zoukankan      html  css  js  c++  java
  • C# 创建线程的简单方式:异步委托 .

    定义一个委托调用的方法:TakesAWhile

    1. //定义委托要引用的方法   
    2. private static int TakesAWhile(int data, int ms)  
    3. {  
    4.     Console.WriteLine("开始...");  
    5.   
    6.     //当前线程(委托线程)阻塞ms毫秒   
    7.     Thread.Sleep(ms);  
    8.   
    9.     Console.WriteLine("完成!");  
    10.   
    11.     return ++data;  
    12. }  

    定义一个委托:

    1. public delegate int TakesAWhileDelegate(int data, int ms);  

    以下是异步调用委托的3种方式:

    1.投票

    1. /* 异步调用委托之:投票,检查委托是否完成任务 star */  
    2. TakesAWhileDelegate d1 = TakesAWhile;  
    3.   
    4. IAsyncResult ar = d1.BeginInvoke(1, 3000, nullnull);  
    5.   
    6. //检查委托是否完成   
    7. while (!ar.IsCompleted)  
    8. {  
    9.     Console.WriteLine(".");  
    10.   
    11.     //当前线程(主线程)阻塞500毫秒,因此最后会打出6个"."   
    12.     Thread.Sleep(500);  
    13. }  
    14.   
    15. //EndInvoke()方法会一直等待,直到委托完成为止,用于接收结果   
    16. int result = d1.EndInvoke(ar);  
    17.   
    18. Console.WriteLine("结果:" + result);  
    19. /*   

    2.等待句柄

    1. /* 异步调用委托之:等待句柄 star */  
    2. TakesAWhileDelegate d1 = TakesAWhile;  
    3.   
    4. IAsyncResult ar = d1.BeginInvoke(1, 3000, nullnull);  
    5.   
    6. while (true)  
    7. {  
    8.     Console.WriteLine(".");  
    9.   
    10.     //AsyncWaitHandle访问等待句柄   
    11.     //WaitOne()第一个参数为一超时时间,即要等待的最大时间,超时返回false,继续while循环   
    12.     if (ar.AsyncWaitHandle.WaitOne(500, false))  
    13.     {  
    14.         Console.WriteLine("可获得结果啦Baby!");  
    15.   
    16.         break;  
    17.     }  
    18. }  
    19.   
    20. //EndInvoke()方法会一直等待,直到委托完成为止,用于接收结果   
    21. int result = d1.EndInvoke(ar);  
    22.   
    23. Console.WriteLine("结果:" + result);  
    24. /* 异步调用委托之:等待句柄 end */  

    3.异步回调

    1. //定义委托调用完毕后的回调方法   
    2. private static void TakesAWhileCommpleted(IAsyncResult ar)  
    3. {  
    4.     if (ar == null)  
    5.     {  
    6.         throw new ArgumentException("ar");  
    7.     }  
    8.   
    9.     TakesAWhileDelegate d1 = ar.AsyncState as TakesAWhileDelegate;  
    10.   
    11.     int result = d1.EndInvoke(ar);  
    12.     Console.WriteLine("结果:" + result);  
    13. }  

    1. /* 异步调用委托之:异步回调 star */  
    2. TakesAWhileDelegate d1 = TakesAWhile;  
    3.   
    4. d1.BeginInvoke(1, 3000, TakesAWhileCommpleted, d1);  
    5.   
    6. for (int i = 0; i < 100; i++)  
    7. {  
    8.     Console.WriteLine(".");  
    9.   
    10.     Thread.Sleep(500);  
    11. }  
    12. /* 异步调用委托之:异步回调 end */  

    注:异步模式,不仅用于委托,异步模式在.NET Framework的各个地方都能见!

  • 相关阅读:
    mysql多源复制,多主一从复制
    Linux初始化环境安装
    sql2014 错误:已将此(这些)订阅标记为不活动,必须将其重新初始化。需要删除NoSync 订阅,然后重新创建它们
    Jmeter之模拟文件上传、下载接口操作--转载
    配置元件 之 用户自定义的变量--转载
    多态中成员函数的特点--转载
    Jmeter:cup监控、脚本录制、执行布置----转载
    Selenium JavascriptExecutor 详解
    selenium+java自动化测试环境搭建介绍--转载
    IO实时监控命令iostat详解-转载
  • 原文地址:https://www.cnblogs.com/amylis_chen/p/3245641.html
Copyright © 2011-2022 走看看