APM异步编程模型

使用 IAsyncResult 设计模式的异步操作

是通过名为 "Begin" 操作名称OperationName 和 "End"操作名称OperationName 的两个方法来实现的,

这两个方法分别开始和结束异步操作 操作名称OperationName。

例如,FileStream 类提供 BeginRead 和 EndRead 方法来从文件异步读取字节。 这两个方法实现了 Read 方法的异步版本。

在调用"Begin" 操作名称OperationName 后,应用程序可以继续在调用线程上执行指令,同时异步操作在另一个线程上执行。

每次调用 Begin操作名称OperationName 时,应用程序还应调用 "End"操作名称操作名称OperationName 来获取操作的结果。

开始异步操作

Begin OperationName 方法开始异步操作 OperationName,并返回实现 IAsyncResult 接口的对象。 IAsyncResult 对象存储有关异步操作的信息。 下表提供了有关异步操作的信息。


成员


说明


AsyncState


一个可选的应用程序特定的对象,包含有关异步操作的信息。


AsyncWaitHandle


一个 WaitHandle,可用来在异步操作完成之前阻止应用程序执行。


CompletedSynchronously


一个值,指示异步操作是否是在用于调用 Begin操作名称OperationName 的线程上完成,而不是在单独的 ThreadPool 线程上完成。


IsCompleted


一个值,指示异步操作是否已完成。

Begin 操作名称OperationName 方法带有该方法的同步版本的签名中声明的任何参数(由值传递或由引用传递)。Begin 操作名称OperationName 方法签名中不包含任何输出参数。

Begin 操作名称OperationName 方法签名另外还包括两个参数。

在这两个参数中,第一个参数定义一个 AsyncCallback 委托,此委托引用在异步操作完成时调用的方法。 如果调用方不希望在操作完成后调用方法,它可以指定 null(在 Visual Basic 中为 Nothing)。

第二个参数是一个用户定义的对象。 此对象可用来向异步操作完成时调用的方法传递应用程序特定的状态信息。

如果 Begin操作名称OperationName 方法还带有其他一些操作特定的参数(例如,一个用于存储从文件读取的字节的字节数组),则 AsyncCallback 和应用程序状态对象将是 Begin操作名称OperationName 方法签名中的最后两个参数。
Begin OperationName操作名称立即返回对调用线程的控制。 如果 Begin操作名称OperationName 方法引发异常,则会在开始异步操作之前引发异常。 如果 Begin操作名称OperationName 方法引发异常,则意味着没有调用回调方法。

结束异步操作

End OperationName 方法可结束异步操作 OperationName。 End 操作名称OperationName 方法的返回值与其同步副本的返回值类型相同,并且是特定于异步操作的。 例如,EndRead 方法返回从 FileStream 读取的字节数,EndGetHostByName 方法返回包含有关主机的信息的 IPHostEntry 对象。 End 操作名称OperationName 方法带有该方法同步版本的签名中声明的所有输出参数或引用参数。 除了来自同步方法的参数外,End操作名称OperationName 方法还包括 IAsyncResult 参数。 调用方必须将对应调用返回的实例传递给 Begin操作名称OperationName。
如果调用 End操作名称OperationName 时 IAsyncResult 对象表示的异步操作尚未完成,则 End操作名称OperationName 将在异步操作完成之前阻止调用线程。 异步操作引发的异常是从 End操作名称OperationName方法引发的。 未定义多次使用同一 IAsyncResult 调用 End操作名称OperationName 方法的效果。 同样,也未定义使用非相关的 Begin 方法返回的 IAsyncResult 调用 End操作名称OperationName 方法的效果。

对于这两种未定义的情况,实施者应考虑引发 InvalidOperationException。

此设计模式的实施者应通知调用方异步操作已通过以下步骤完成:将 IsCompleted 设置为 true,调用异步回调方法(如果已指定一个回调方法),然后发送 AsyncWaitHandle 信号。

对于访问异步操作的结果,应用程序开发人员有若干种设计选择。 正确的选择取决于应用程序是否有可以在操作完成时执行的指令。 如果应用程序在接收到异步操作结果之前不能进行任何其他工作,则必须先阻止该应用程序进行其他工作,等到获得这些操作结果后再继续进行。 若要在异步操作完成之前阻止应用程序,您可以使用下列方法之一:

从应用程序的主线程调用 End操作名称OperationName,阻止应用程序执行,直到操作完成之后再继续执行。 有关演示此方法的示例,请参见 通过结束异步操作来阻止应用程序执行。

使用 AsyncWaitHandle 来阻止应用程序执行,直到一个或多个操作完成之后再继续执行。 有关演示此方法的示例,请参见 使用 AsyncWaitHandle 阻止应用程序的执行。

在异步操作完成时不需要阻止的应用程序可使用下列方法之一:

按以下方式轮询操作完成状态:定期检查 IsCompleted 属性,操作完成后调用 End操作名称OperationName。 有关演示此方法的示例,请参见 轮询异步操作的状态。

使用 AsyncCallback 委托来指定操作完成时要调用的方法。 有关演示此方法的示例,请参见 使用 AsyncCallback 委托结束异步操作。

时间: 2024-10-10 13:25:25

APM异步编程模型的相关文章

.net异步编程の-------异步编程模型(APM)

术语解释: APM               异步编程模型, Asynchronous Programming Model EAP                基于事件的异步编程模式, Event-based Asynchronous Pattern TAP                基于任务的异步编程模式, Task-based Asynchronous Pattern 一.异步编程 APM即异步编程模型的简写(Asynchronous Programming Model),大家在写代

C#异步编程模型

什么是异步编程模型 异步编程模型(Asynchronous Programming Model,简称APM)是C#1.1支持的一种实现异步操作的编程模型,虽然已经比较"古老"了,但是依然可以学习一下的.通过对APM的学习,我总结了以下三点: 1. APM的本质是使用委托和线程池来实现异步编程的. 2. 实现APM的关键是要实现IAsyncResult接口. 3. 实现了APM的类都会定义一对形如BeginXXX()和EndXXX()的方法,例如,FileStream类定义了BeginR

异步编程模型(APM)

一.概念 APM即异步编程模式的简写(Asynchronous Programming Model).大家在写代码的时候或者查看.NET 的类库的时候肯定会经常看到和使用以BeginXXX和EndXXX类似的方法,其实你在使用这些方法的时候,你就再使用异步编程模型来编写程序.NET Framework很多类也实现了该模式,同时我们也可以自定义类来实现该模式,(也就是在自定义的类中实现返回类型为IAsyncResult接口的BeginXXX方法和EndXXX方法),另外委托类型也定义了BeginI

.NET “底层”异步编程模式——异步编程模型

本文内容 异步编程类型 环境 异步编程模型(APM) 参考资料 首先澄清,异步编程模式(Asynchronous Programming Patterns)与异步编程模型(Asynchronous Programming Model,APM),它们的中文翻译只差一个字,英文名称差在最后一个单词,看英文一个是 Pattern,一个是 Model.Model 比 Pattern 更具体.前者是一个统称,比后者含义要广,前者包含三个模型,而 APM 只是它其中一个而已. 个人理解,异步编程模型(APM

多线程之异步编程: 经典和最新的异步编程模型,async与await

经典的异步编程模型(IAsyncResult) 最新的异步编程模型(async 和 await) 将 IAsyncInfo 转换成 Task 将 Task 转换成 IAsyncInfo 示例1.使用经典的异步编程模型(IAsyncResult)实现一个支持异步操作的类Thread/Async/ClassicAsync.cs /* * 使用经典的异步编程模型(IAsyncResult)实现一个支持异步操作的类 */ using System; using System.Collections.Ge

简单地使用线程之一:使用异步编程模型

.NetFramework的异步编程模型从本质上来说是使用线程池来完成异步的任务,异步委托.HttpWebRequest等都使用了异步模型. 这里我们使用异步委托来说明异步编程模型. 首先,我们来明确一下,对于多线程来说,我们需要关注哪些问题. “线程是一段执行中的代码流”,从这句话中,我们可以关注这段代码流何时开始执行.何时结束.从主线程如何传递参数至从子线程.从子线程如何返回结果至主线程? 问题1:在异步编程模型中,子线程何时开始执行? 对于异步编程模型来说,使用BeginXXX来开始执行线

8天玩转并行开发——第六天 异步编程模型

在.net里面异步编程模型由来已久,相信大家也知道Begin/End异步模式和事件异步模式,在task出现以后,这些东西都可以被task包装 起来,可能有人会问,这样做有什么好处,下面一一道来. 一: Begin/End模式 1: 委托 在执行委托方法的时候,我们常常会看到一个Invoke,同时也有一对你或许不常使用的BeginInvoke,EndInvoke方法对,当然Invoke方法 是阻塞主线程,而BeginInvoke则是另开一个线程. 1 class Program 2 { 3 sta

.net C# 中的APM异步编程方式

APM(Asynchrocous Programming Model)方式: 通过委托类异步调用方法: 1.定义一个委托类型: delegate int MyDeletateType(string s); 2.实例化一个委托实例,构造时候传入需要异步调用的函数FuncA var del = new MyDeletateType(FuncA); int FuncA(string a){Console.WriteLine(a);return 1;} 或者 var del = new MyDeleta

异步编程模型

class Program { static void Main(string[] args) { var func = new Func<string, string>(i => { return i + "i can fly"; }); var state = func.BeginInvoke("yes,", Callback, func); Console.Read(); } static void Callback(IAsyncResult