使用 IAsyncResult 进行 .NET 异步编程

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

微软早在.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()的返回值是一样的。

例如

 

public delegate string AsyncMethodCaller((object param1, object param2);
  
public class AsyncDemo
{
 
 private AsyncMethodCaller _asyncDelegate = new AsyncMethodCaller(Run);
 
 public IAsyncResult BeginRun(object param1, object param2, AsyncCallback asyncCallBack, Object asyncState)
 
 {
 
 asyncDelegate.BeginInvoke(param1, param2, callBack, stateObject); 
 }
 
 public object EndRun(IAsyncResult asyncResult)
 
{
 
m_asyncDelegate.EndInvoke(asyncResult); 
 }
 
 Public object Run(object param1, object param2); 
}
 

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

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

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

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

 

 IAsyncResult result = AsyncDemo.BeginRun(param1, param2, null, null);
 
 AsyncDemo.EndRun(result);
 
 // when Run() method is completed. Continue to go.
 
ContinueToGo();

 

 

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

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

 

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

 

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

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

 

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

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

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

 

Public void MainFunc()
 
 {
 
 AsyncCallback callBack = new AsyncCallback(ProcessRun);
 
 IAsyncResult result = AsyncDemo.BeginRun(param1, param2, callBack, null);
 
 ContinueToGo();
 
 }
 
 Public void ProcessRun(IAsyncResult result) 
 {
 
 AsyncDemo.EndRun(result);
 
 }
相关文章
|
4月前
|
数据库 开发者
.NET 异步编程之谜:async/await 模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第28天】在当今注重效率和响应性的软件开发领域,.NET 的 async/await 模式如同得力助手,简化异步代码编写,使代码更易理解和维护。通过后台执行耗时操作,如网络请求和数据库查询,避免阻塞主线程,显著提升系统响应性。此模式不仅适用于网络请求,还广泛应用于数据库操作和文件读写。合理使用 async/await 可大幅优化性能,但需注意避免过度使用、正确处理调用链及异常,以确保系统稳定性和高效性。深入探索 async/await,助您构建更出色的应用程序。
53 0
|
6月前
|
设计模式 存储 编译器
【.NET Core】异步编程模式
【.NET Core】异步编程模式
48 2
|
6月前
|
SQL 设计模式 开发框架
.NET异步有多少种实现方式?(异步编程提高系统性能、改善用户体验)
想要知道.NET异步有多少种实现方式,首先我们要知道.NET提供的执行异步操作的三种模式,然后再去了解.NET异步实现的四种方式。
|
6月前
|
开发框架 .NET 对象存储
【.NET Core】深入理解异步编程模型(APM)
【.NET Core】深入理解异步编程模型(APM)
120 1
|
编译器 vr&ar C#
.Net异步编程详解入门
.Net异步编程详解入门目录 前言异步编程不同模式一、异步模式二、基于事件的异步模式三、基于任务的异步模式异步编程的基础一、创建任务二、调用异步方法三、使用Awaiter四、延续任务五、多个异步方法的使用六、使用ValueTasks七、转换异步模式异步编程的错误处理一、异步方法的异步处理二、多个异步方法的异步处理三、使用AggregateException总结 回到顶部前言  今天周五,早上起床晚了。
751 0
|
vr&ar
一起谈.NET技术,.NET中的异步编程:使用F#简化异步编程
  不管是使用yield或借助第三方类库来简化异步编程,或多或少总是感觉不那么正统,有点hack的感觉。这种感觉在实验阶段倒还可以,要是用在产品中总有点担心,即使这些类库来自权威的第三方,我不知道大家有没有跟我同样的感觉。
909 0
|
.NET API 分布式数据库
一起谈.NET技术,.NET异步编程:IO完成端口与BeginRead
  写这个系列原本的想法是讨论一下.NET中异步编程风格的变化,特别是F#中的异步工作流以及未来的.NET 5.0中的基于任务的异步编程模型。但经过前几篇文章(为什么需要异步,传统的异步编程,使用CPS及yield实现异步)的发表后,很多人对IO异步背后实现的原理以及为什么这样能提高性能很感兴趣。
1187 0
|
.NET 分布式数据库 API
一起谈.NET技术,.NET中的异步编程- IO完成端口以及FileStream.BeginRead
  写这个系列原本的想法是讨论一下.NET中异步编程风格的变化,特别是F#中的异步工作流以及未来的.NET 5.0中的基于任务的异步编程模型。但经过三篇文章后很多人对IO异步背后实现的原理以及为什么这样能提高性能很感兴趣。
838 0
|
Java .NET vr&ar
一起谈.NET技术,.NET中的异步编程(二)- 传统的异步编程
  在上一篇文章中,我们从构建响应灵敏的界面以及构建高可伸缩性的服务应用来讨论我们为什么需要异步编程,异步编程能给我们带来哪些好处。那么知道了好处,我们就开始吧,但是在异步编程这个方面,说总是比做简单。
1131 0
|
C# vr&ar
一起谈.NET技术,.NET中的异步编程-Continuation passing style以及使用yield实现异步
  传统的异步方式将本来紧凑的代码都分成两部分,不仅仅降低了代码的可读性,还让一些基本的程序构造无法使用,所以大部分开发人员在遇到应该使用异步的地方都忍痛割爱。本来我在本篇文章中想讨论一下.NET世界中已有的几个辅助异步开发的类库,但是经过思考后觉得在这之前介绍一下一些理论知识也许对理解后面的类库以及更新的内容有所帮助。
804 0