• C#中通过BeginInvoke()和EndInvoke()来实现异步


    .NET Framework允许异步调用任何方法。定义与需要调用的方法具有相同签名的委托;公共语言运行库将自动为该委托定义具有适当签名的 BeginInvoke 和 EndInvoke 方法。以下介绍C#中,通过BeginInvoke()和EndInvoke()来实现异步。

     

    1、异步编程

    调用BeginInvoke可以执行任务,然后调用EndInvoke阻塞直到调用完成。使用IAsyncResult.AsyncWaitHandle属性获取WaitHandle ,使用其WaitOne方法阻止执行,直到发出WaitHandle信号,然后调用EndInvoke轮询返回的IAsyncResultBeginInvoke以确定异步调用何时完成,然后调用EndInvoke。将回调方法的委托传递给BeginInvoke。当异步调用完成时,该方法在ThreadPool线程上执行。回调方法调用EndInvokeBeginInvoke 立即返回,不等待异步调用完成。BeginInvoke 返回 IasyncResult,可用于监视调用进度。EndInvoke 方法用于检索异步调用结果。调用 BeginInvoke 后可随时调用 EndInvoke 方法;如果异步调用未完成,EndInvoke 将一直阻塞到异步调用完成。

    2、同步方法和异步方法区别

    同步方法调用在程序继续执行之前,需要等待同步方法执行完毕返回结果,异步方法则在被调用之后,立即返回以便程序在被调用方法完成其任务的同时执行其它操作。

    3、异步操作的优缺点

    异步操作无须额外的线程负担,并且使用回调的方式进行处理,在设计良好的情况下,处理函数可以不必使用共享变量,即使无法完全不用,最起码可以减少共享变量的数量,减少了死锁的可能。当然异步操作也并非完美。编写异步操作的复杂程度较高,程序主要使用回调方式进行处理,与普通人的思维方式有些初入,而且难以调试。

    4、BeginInvoke()和EndInvoke()的使用

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading;
    6. namespace ConsoleApplication
    7. {
    8. class Program
    9. {
    10. static void Main(string[] args)
    11. {
    12. Func<DateTime> func = () =>
    13. {
    14. Thread.Sleep(1000);
    15. return DateTime.Now;
    16. };
    17. Console.WriteLine($"func.Invoke()={func.Invoke()}");
    18. //EndInvoke(r)用来获取执行后的返回值,BeginInvoke()的第一个参数是func执行完成后回调用函数
    19. IAsyncResult asyncResult = func.BeginInvoke(r =>
    20. {
    21. //Console.WriteLine(func.EndInvoke(r));
    22. Console.WriteLine(r.AsyncState);
    23. }, "cjavapy");
    24. //asyncResult.AsyncWaitHandle.WaitOne();一直等到完成后,才会执行下一行代码
    25. //asyncResult.AsyncWaitHandle.WaitOne(5000);指定等待超时的时间为5s
    26. Console.WriteLine(func.EndInvoke(asyncResult));
    27. //Thread.Sleep(6000);
    28. }
    29. }
    30. }

     注意EndInvoke()获取返回值只能调用一次,不能重复调用。

  • 相关阅读:
    22081-12-5 cortex-A7核PWM实验
    Leetcode 【260. 只出现一次的数字 III】
    Windows安装SSH教程
    51单片机DS18B20温度报警器proteus仿真设计_可调上下限
    php万年历源代码!源代码![上一年、上一月、下一月、下一年、附加当天日期加背景颜色]-私聊源码
    宽字节注入
    比特币 ZK 赏金系列:第 2 部分——查找哈希冲突
    在win10环境下安装python,配置python环境,执行python脚本
    CentOS 7 搭建 Keepalived+LVS NAT模式 高可用集群
    用手机浏览器浏览不良网站,清理数据还有用吗?
  • 原文地址:https://blog.csdn.net/lwf3115841/article/details/134079726