当前位置: 首页 > news >正文

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()的使用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApplication
{class Program{static void Main(string[] args){Func<DateTime> func = () =>{Thread.Sleep(1000);return DateTime.Now;};Console.WriteLine($"func.Invoke()={func.Invoke()}");//EndInvoke(r)用来获取执行后的返回值,BeginInvoke()的第一个参数是func执行完成后回调用函数IAsyncResult asyncResult = func.BeginInvoke(r =>{//Console.WriteLine(func.EndInvoke(r));Console.WriteLine(r.AsyncState);}, "cjavapy");//asyncResult.AsyncWaitHandle.WaitOne();一直等到完成后,才会执行下一行代码//asyncResult.AsyncWaitHandle.WaitOne(5000);指定等待超时的时间为5sConsole.WriteLine(func.EndInvoke(asyncResult));//Thread.Sleep(6000);}}
}

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

http://www.lryc.cn/news/210717.html

相关文章:

  • github中.gitignore不起作用啦
  • 同步网盘推荐及挑选指南:便捷、安全、适用的选择
  • Java中的QName
  • 汇编语言-div指令溢出问题
  • koa搭建服务器(一)
  • qt-C++笔记之在两个标签页中按行读取两个不同的文件并且滚动条自适应滚动范围高度
  • github搜索技巧探索
  • [ACTF2020 新生赛]Include
  • Go 实现插入排序算法及优化
  • LuatOS-SOC接口文档(air780E)--max30102 - 心率模块
  • 设计模式(2)-创建型模式
  • elasticsearch一些重要的配置参数
  • raft和zab算法的区别
  • Arthas生成火焰图命令报错汇总
  • 【PyQt学习篇 · ⑤】:QWidget - 鼠标操作
  • 2-多媒体数据压缩国际标准-Part3
  • 使用Go模块进行依赖管理
  • 人工智能与航天技术的融合:未来发展的新趋势
  • 私有云:【11】win10安装Agent客户端组件
  • 什么是程序化交易
  • 企业如何安全跨国传输30T文件数据
  • 【Linux】centos安装配置及远程连接工具的使用
  • 算法|每日一题|掷骰子等于目标和的方法数|动态规划
  • Java架构师软件工程全流程
  • 深度学习中Transformer的简单理解
  • Java架构师系统安全
  • Stable Diffusion 图生图+ControlNet list index out of range
  • SylixOS BSP开发(七)
  • 多媒体应用设计师 第15章 多媒体素材的制作和集成
  • CentOS和Ubuntu命令行方式配置静态IP