- 异步编程类型
- 异步编程模型(APM)
- 参考资料
首先澄清,异步编程模式(Asynchronous Programming Patterns)与异步编程模型(Asynchronous Programming Model,APM),它们的中文翻译只差一个字,英文名称差在最后一个单词,一个是 Pattern,一个是 Model。模型 Model 比 模式 Pattern 更具体。前者是一个统称,比后者含义要广,前者包含三个模型,而 APM 只是它其中一个而已。
个人理解,异步编程模型(APM)是较底层的一个异步编程模式,在多核时代,这种方式越来越不适用,微软已经不建议使用这种异步方式编程,而是采用基于任务的异步模式(TAP),利用 async 和 await 关键字,但如果不了解 APM,就会成为并行编程、并行编程与异步编程相结合以及理解 TAP 的障碍。并行编程是为了多核 CPU。
下载 Demo
异步编程模式
.NET Framework 提供了执行异步操作的三种模式:
- 异步编程模型 (APM) 模式(也称 IAsyncResult 模式),在此模式中异步操作需要 Begin 和 End 方法(比如用于异步写入操作的 BeginWrite 和 EndWrite)。 对于新的开发工作不再建议采用此模式。
- 基于事件的异步模式 (EAP),这种模式需要 Async 后缀,也需要一个或多个事件、事件处理程序委托类型和 EventArg 派生类型。 EAP 是在 .NET Framework 2.0 中引入的。 对于新的开发工作不再建议采用此模式。
- 基于任务的异步模式 (TAP) ,使用一种方法来表示异步操作的启动和完成。TAP 是在 .NET Framework 4 中引入的,并且它是在 .NET Framework 中进行异步编程的推荐使用方法。 C# 中的 async 和 await 关键词为 TAP 添加了语言支持。
本文主要说明异步编程模型(APM)。
异步编程模型(APM)
使用 IAsyncResult 设计模式的异步操作名为“Begin+操作名称”和“End+操作名称”,这两个方法分别开始和结束异步操作。例如,FileStream 类提供 BeginRead 和 EndRead 方法从文件异步读取字节。这两个方法实现了 Read 方法的异步版本。
在调用“Begin+操作名称”方法后,应用程序可以继续在调用线程上执行,同时异步操作在另一个线程上执行。
每次调用“Begin+操作名称”方法时,应用程序还需调用“End+操作名称”方法来获取操作的结果。
环境
- Windows 7 旗舰版 SP1
- Microsoft Visual Studio Ultimate 2013 Update 4
开始异步操作
“Begin+操作名称”方法开始异步操作,并返回实现 IAsyncResult 接口的对象。 IAsyncResult 对象存储有关异步操作的信息,其成员如下表所示:
| 成员 | 说明 |
| AsyncState | 一个可选的应用程序特定的对象,包含有关异步操作的信息。 |
| AsyncWaitHandle | 一个 WaitHandle,可用来在异步操作完成之前阻止应用程序执行。 |
| CompletedSynchronously | 一个值,指示异步操作是否是在用于调用 Begin操作名称OperationName 的线程上完成,而不是在单独的 ThreadPool 线程上完成。 |
| IsCompleted | 一个值,指示异步操作是否已完成。 |
下面签名是 FileStream 的异步和同步的 Write 方法:
public override void Write(byte[] array, int offset, int count);