.NET 提供了三种用于执行异步作的模式:
基于任务的异步模式 (TAP),它使用单个方法来表示异步作的启动和完成。 TAP 已在 .NET Framework 4 中引入。 这是在 .NET 中推荐的异步编程方式。 C# 中的 async 和 await 关键字以及 Visual Basic 中的 Async 和 Await 运算符添加了对 TAP 的语言支持。 有关详细信息,请参阅基于任务的异步模式(TAP)。
基于事件的异步模式(EAP),这是一个提供异步行为的基于事件的传统模型。 它需要一种具有
Async
后缀的方法,该方法包含一个或多个事件、事件处理程序委托类型和EventArg
派生类型。 EAP 是在 .NET Framework 2.0 中引入的。 建议新开发中不再使用这种模式。 有关详细信息,请参阅基于事件的异步模式(EAP)。异步编程模型 (APM) 模式( 也称为 IAsyncResult 模式),这是使用 IAsyncResult 接口提供异步行为的旧模型。 在此模式中,异步操作需要
Begin
和End
方法(例如,使用BeginWrite
和EndWrite
方法来实现异步写入操作)。 对于新开发,不再建议使用此模式。 有关详细信息,请参阅异步编程模型(APM)。
模式比较
若要快速比较三种模式模型异步作的方式,请考虑一种 Read
从指定偏移量开始,将指定数据量读取到提供的缓冲区的方法:
public class MyClass
{
public int Read(byte [] buffer, int offset, int count);
}
此方法的 TAP 对应项将公开以下单个 ReadAsync
方法:
public class MyClass
{
public Task<int> ReadAsync(byte [] buffer, int offset, int count);
}
EAP 模块将公开以下一组类型和成员:
public class MyClass
{
public void ReadAsync(byte [] buffer, int offset, int count);
public event ReadCompletedEventHandler ReadCompleted;
}
对应的 APM 将公开 BeginRead
和 EndRead
方法:
public class MyClass
{
public IAsyncResult BeginRead(
byte [] buffer, int offset, int count,
AsyncCallback callback, object state);
public int EndRead(IAsyncResult asyncResult);
}