Шаблоны асинхронного программирования
В .NET есть три шаблона для выполнения асинхронных операций:
Асинхронный шаблон на основе задач (TAP) , который использует один метод для запуска и завершения асинхронной операции. Шаблон TAP был реализован в .NET Framework 4. Именно его рекомендуется использовать для асинхронного программирования в .NET. Ключевые слова async и await в C#, а также операторы Async и Await в Visual Basic добавляют для 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);
}