微软早在.net2.0, 也就是VS2005的时候,就提供了一整套的异步编程设计模式,有3中常用的方式:

1. 使用 IAsyncResult 调用异步方法

2. 使用委托进行异步编程

3. 使用事件进行异步多线程编程

注: IAsyncResult 方式通常是用委托来实现的。所以可以认为前面2种方式就是一种。

http://msdn.microsoft.com/zh-cn/library/2e08f6yc.aspx

使用 IAsyncResult 调用异步方法

1. 有两个配对的方法,BeginXXX() 和 EndXXX()。它们是XXX()方法的异步执行。

BegingXXX()的参数是在XXX()的参数基础上增加 AsyncCallback 和 AsyncState。

EndXXX()的返回值和XXX()的返回值是一样的。

例如

  1. public delegate string AsyncMethodCaller((object param1, object param2);
  2. public class AsyncDemo
  3. {
  4. private AsyncMethodCaller _asyncDelegate = new AsyncMethodCaller(Run);
  5. public IAsyncResult BeginRun(object param1, object param2, AsyncCallback asyncCallBack, Object asyncState)
  6. {
  7. asyncDelegate.BeginInvoke(param1, param2, callBack, stateObject);
  8. }
  9. public object EndRun(IAsyncResult asyncResult)
  10. {
  11. m_asyncDelegate.EndInvoke(asyncResult);
  12. }
  13. Public object Run(object param1, object param2);
  14. }

2. IAsyncResult 对象中存储有关异步操作的信息。

3. 阻止应用程序执行的几种方法

a. 通过结束异步操作来阻止应用程序执行

就是EndXXX() 调用时,如果 IAsyncResult 对象表示异步操作未完成,则调用线程会被阻止,就是说它之后的逻辑的会被阻止。

  1. IAsyncResult result = AsyncDemo.BeginRun(param1, param2, null, null);
  2. AsyncDemo.EndRun(result);
  3. // when Run() method is completed. Continue to go.
  4. ontinueToGo();

b. 使用 AsyncWaitHandle 阻止应用程序的执行。

在BeingXXX()之后调用 IAsyncResult.AsyncWAitHandle 中的相应方法也可以阻止调用线程。例如

  1. IAsyncResult result = AsyncDemo.BeginRun(param1, param2, null, null);
  2. // Wait until the operation completes.
  3. result.AsyncWaitHandle.WaitOne();

c. 轮询异步操作的状态。

在BeingXXX()之后调轮询IAsyncResult.IsCompleted属性来确定此操作是否已完成

  1. IAsyncResult result = AsyncDemo.BeginRun(param1, param2, null, null);
  2. While(result.IsCompleted != true)
  3. {
  4. // Waiting until IsCompleted is true.
  5. }
  6. // when Run() method is completed. Continue to go.
  7. ContinueToGo();

d. 使用 AsyncCallback 委托结束异步操作。

就是在代理里面根据具体情况调用Endxxx()方法来让调用线程继续运行。

  1. Public void MainFunc()
  2. {
  3. AsyncCallback callBack = new AsyncCallback(Proce***un);
  4. IAsyncResult result = AsyncDemo.BeginRun(param1, param2, callBack, null);
  5. ContinueToGo();
  6. }
  7. Public void Proce***un(IAsyncResult result)
  8. {
  9. AsyncDemo.EndRun(result);
  10. }

转载于:https://blog.51cto.com/powertoolsteam/528841

使用 IAsyncResult 进行 .NET 异步编程相关推荐

  1. 使用 IAsyncResult 进行 .NET 异步编程(转载)

    微软早在.net2.0, 也就是VS2005的时候,就提供了一整套的异步编程设计模式,有3中常用的方式: 1. 使用 IAsyncResult 调用异步方法 2. 使用委托进行异步编程 3. 使用事件 ...

  2. 异步编程模型--使用 IAsyncResult 对象

    先推荐阅读下面的资料: MSDN:异步编程设计模式 IBM developerworks: 使用异步 I/O 大大提高应用程序的性能 参考博文: 1.正确使用异步操作 2.Lab:体会ASP.NET异 ...

  3. C#异步编程模式IAsyncResult概述

    C#异步编程模式IAsyncResult概述 IAsyncResult 异步设计模式通过名为 BeginOperationName 和 EndOperationName 的两个方法来实现原同步方法的异 ...

  4. 【转】1.6异步编程:IAsyncResult异步编程模型 (APM)

    传送门:异步编程系列目录-- 大部分开发人员,在开发多线程应用程序时,都是使用ThreadPool的QueueUserWorkItem方法来发起一次简单的异步操作.然而,这个技术存在许多限制.最大的问 ...

  5. .N“.NET研究”ET中的异步编程(二)- 传统的异步编程

    在上一篇文章中,我们从构建响应灵敏的界面以及构建高可伸缩性的服务应用来讨论我们为什么需要异步编程,异步编程能给我们带来哪些好处.那么知道了好处,我们就开始吧,但是在异步编程上海徐汇企业网站制作这个方面 ...

  6. C#:异步编程和线程的使用(.NET 4.5 ),异步方法改为同步执行

    摘自:http://www.codeproject.com/Articles/996857/Asynchronous-programming-and-Threading-in-Csharp-N(葡萄城 ...

  7. 异步编程 In .NET(转载)

    概述 在之前写的一篇关于async和await的前世今生的文章之后,大家似乎在async和await提高网站处理能力方面还有一些疑问,博客园本身也做了不少的尝试.今天我们再来回答一下这个问题,同时我们 ...

  8. NET中的异步编程(二)- 传统的异步编程

    转自:http://www.cnblogs.com/yuyijq/archive/2011/02/22/1960273.html 在上一篇文章中,我们从构建响应灵敏的界面以及构建高可伸缩性的服务应用来 ...

  9. Atitit.异步编程 java .net php python js 对照

    Atitit.异步编程 java .net php python js 的比較 1. 1.异步任务,异步模式,  APM模式,,  EAP模式, TAP 1 1.1.       APM模式: Beg ...

最新文章

  1. 计算机应用基础试题及答案试卷号7074,阅读文章,完成试题。后来才知道,在这千钧一发的时刻,是郝副营长划着了火柴,点燃了那本书,举得高高的, - 学进去中小学试卷试题库...
  2. 分配性质是什么意思_苏教版六年级数学上册3.9按比分配问题(1)微课视频 | 练习...
  3. 四年,如何从前端小白蜕变为前端技术专家?
  4. java requestbody map_java-如何将Map转换为RequestBody?
  5. 防止刷新重复post提交
  6. phpmailer thinkphp3.2发送邮件
  7. Acme CAD Converter 2019简体中文直装破解版
  8. NYOJ456andNYOJ325
  9. 事件驱动架构在 vivo 内容平台的实践
  10. 使用window.close()关闭标签页的注意事项
  11. Cosy V3.1.3 简洁大气WordPress博客主题自适应个人自媒体网站模板(含积木部分插件)
  12. java基于ssm房屋出售租赁管理系统
  13. android 文本倒影,Android 生成倒影图片
  14. Linux开发环境部署
  15. MAC OSX stdio.h或iostream等头文件无法找到的解决办法
  16. 学习笔记-Depth Map Prediction from a Single Image using a Multi-Scale Deep Network
  17. cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-buil
  18. Chapter 2 认识游戏
  19. Java 视频转换h265、h264、mkv、mp4
  20. 互动课件制作 html,互动教学课件制作神器,从此丢掉PPT

热门文章

  1. vue中的方法如何暴露给webview,使安卓和iOS可以调用
  2. jQuery与Ajax的应用——《锋利的jQuery》(第2版)读书笔记3
  3. gdb的user-define command
  4. [ZT]图像处理库的比较:OpenCV,FreeImage,CImg,CxImage
  5. wordpress 安装(亲身经历) 出现“Fatal error: Call to undefined function get_magic_quotes_gpc()”之后的解决方法...
  6. 5种不会被机器智能替代的能力
  7. 一文看懂数据预处理最重要的3种思想和方法
  8. 榜单:全球 35 位 35 岁以下科技创新青年
  9. 对数组下面的数组截取_numpy数组不同索引方式的区别
  10. 醉了!吃着火锅哼着歌,男朋友强行给我科普什么是补码!