使用 IAsyncResult
设计模式的异步操作是通过名为 BeginOperationName
和 EndOperationName
的两个方法来实现的,这两个方法分别开始和结束异步操作 OperationName
。 例如, FileStream
类提供 BeginRead
和 EndRead
方法来从文件异步读取字节。 这两个方法实现了 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
方法用于结束异步操作 OperationName
。 EndOperationName
方法的返回值与其同步对应方法的返回值类型相同,并且是特定于异步操作的。 除了来自同步方法的参数外,EndOperationName
方法还包括 IAsyncResult
参数。 调用方必须将对应调用返回的实例传递给 BeginOperationName
。
如果调用 IAsyncResult
时 EndOperationName
对象表示的异步操作尚未完成,则 EndOperationName
将在异步操作完成之前阻止调用线程。
对于访问异步操作的结果,应用程序开发人员有若干种设计选择。 正确的选择取决于应用程序是否有可以在操作完成时执行的指令。 如果应用程序在接收到异步操作结果之前不能进行任何其他工作,则必须在获得这些结果之前先阻止该应用程序进行其他工作。 若要在异步操作完成之前阻止应用程序,可以使用下列方法之一:
EndOperationName
,阻止应用程序执行,直到操作完成之后再继续执行。AsyncWaitHandle
来阻止应用程序执行,直到一个(WaitOne()
、WaitAny()
)或多个(WaitAll()
操作完成。在异步操作完成时不需要阻止的应用程序可使用下列方法之一:
IsCompleted
属性,操作完成后调用 EndOperationName
。AsyncCallback
委托来指定要在操作完成时调用的方法。原文:https://www.cnblogs.com/yu_xing/p/asynchronous_programming_model.html