异步编程模型

异步编程模型

使用 IAsyncResult 设计模式的异步操作是通过名为 BeginOperationNameEndOperationName 的两个方法来实现的,这两个方法分别开始和结束异步操作 OperationName 。 例如, FileStream 类提供 BeginReadEndRead 方法来从文件异步读取字节。 这两个方法实现了 Read 方法的异步版本。

在调用 BeginOperationName 后,应用程序可以继续在调用线程上执行指令,同时异步操作在另一个线程上执行。 每次调用 BeginOperationName 时,应用程序还应调用 EndOperationName 来获取操作的结果。

开始异步操作

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

成员 说明
AsyncState 一个特定于应用程序的可选对象,其中包含有关异步操作的信息。
AsyncWaitHandle 一个 WaitHandle ,可用来在异步操作完成之前阻止应用程序执行。
CompletedSynchronously 一个值,指示异步操作是否是在用于调用 BeginOperationName 的线程上完成,而不是在单独的 ThreadPool 线程上完成。
IsCompleted 一个值,指示异步操作是否已完成。

BeginOperationName 方法签名中不包含任何输出参数。 BeginOperationName 方法签名另外还包括两个其他参数。
第一个参数定义一个 AsyncCallback 委托,此委托引用在异步操作完成时调用的方法。 如果调用方不希望在操作完成后调用方法,它可以指定 null
第二个参数是一个用户定义的对象。 此对象可用来向异步操作完成时调用的方法传递应用程序特定的状态信息。 如果 BeginOperationName 方法还采用其他一些操作特定的参数(例如,一个用于存储从文件读取的字节的字节数组),则 AsyncCallback应用程序状态对象将是 BeginOperationName 方法签名中的最后两个参数

BeginOperationName 立即返回对调用线程的控制。 如果 BeginOperationName 方法引发异常,则会在开始异步操作之前引发异常。 如果 BeginOperationName 方法引发异常,则意味着没有调用回调方法。

结束异步操作

EndOperationName 方法用于结束异步操作 OperationNameEndOperationName 方法的返回值与其同步对应方法的返回值类型相同,并且是特定于异步操作的。 除了来自同步方法的参数外,EndOperationName 方法还包括 IAsyncResult 参数。 调用方必须将对应调用返回的实例传递给 BeginOperationName

如果调用 IAsyncResultEndOperationName 对象表示的异步操作尚未完成,则 EndOperationName 将在异步操作完成之前阻止调用线程。

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

  • 从应用程序的主线程调用 EndOperationName,阻止应用程序执行,直到操作完成之后再继续执行。
  • 使用 AsyncWaitHandle 来阻止应用程序执行,直到一个(WaitOne()WaitAny())或多个(WaitAll()操作完成。

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

  • 轮询操作完成状态:定期检查 IsCompleted 属性,操作完成后调用 EndOperationName
  • 使用 AsyncCallback 委托来指定要在操作完成时调用的方法。
原文地址:https://www.cnblogs.com/yu_xing/p/asynchronous_programming_model.html