Шаблоны асинхронного программированияAsynchronous programming patterns

В .NET есть три шаблона для выполнения асинхронных операций:.NET provides three patterns for performing asynchronous operations:

  • Асинхронный шаблон на основе задач (TAP) , который использует один метод для запуска и завершения асинхронной операции.Task-based Asynchronous Pattern (TAP), which uses a single method to represent the initiation and completion of an asynchronous operation. Шаблон TAP был реализован в .NET Framework 4.TAP was introduced in the .NET Framework 4. Именно его рекомендуется использовать для асинхронного программирования в .NET.It's the recommended approach to asynchronous programming in .NET. Ключевые слова async и await в C#, а также операторы Async и Await в Visual Basic добавляют для TAP поддержку языка.The async and await keywords in C# and the Async and Await operators in Visual Basic add language support for TAP. Дополнительные сведения см. в разделе Асинхронный шаблон, основанный на задачах (TAP).For more information, see Task-based Asynchronous Pattern (TAP).

  • Асинхронная модель на основе событий (EAP) . Это устаревшая модель на основе событий, обеспечивающая работу в асинхронном режиме.Event-based Asynchronous Pattern (EAP), which is the event-based legacy model for providing asynchronous behavior. Для нее требуется метод с суффиксом Async, одно или несколько событий, типы делегатов обработчика событий и производные типы EventArg.It requires a method that has the Async suffix and one or more events, event handler delegate types, and EventArg-derived types. Протокол EAP был введен в платформа.NET Framework 2.0.EAP was introduced in the .NET Framework 2.0. Ее не рекомендуется использовать для новых разработок.It's no longer recommended for new development. Дополнительные сведения см. в разделе Асинхронная модель на основе событий (EAP).For more information, see Event-based Asynchronous Pattern (EAP).

  • Модель асинхронного программирования (APM) (также называется шаблоном IAsyncResult). Это устаревшая модель, в которой для реализации асинхронного поведения используется интерфейс IAsyncResult.Asynchronous Programming Model (APM) pattern (also called the IAsyncResult pattern), which is the legacy model that uses the IAsyncResult interface to provide asynchronous behavior. В этом шаблоне для синхронных операций требуются методы Begin и End (например, BeginWrite и EndWrite позволяют реализовать асинхронную операцию записи).In this pattern, synchronous operations require Begin and End methods (for example, BeginWrite and EndWrite to implement an asynchronous write operation). Этот шаблон не рекомендуется использовать для разработки новых приложений.This pattern is no longer recommended for new development. Дополнительные сведения см. в статье Асинхронная модель программирования (APM).For more information, see Asynchronous Programming Model (APM).

Сравнение шаблоновComparison of patterns

Для быстрого сравнения, как с помощью трех шаблонов моделировать асинхронные операции, рассмотрим метод Read, который считывает указанный объем данных в предоставленный буфер, начиная с заданного смещения:For a quick comparison of how the three patterns model asynchronous operations, consider a Read method that reads a specified amount of data into a provided buffer starting at a specified offset:

public class MyClass  
{  
    public int Read(byte [] buffer, int offset, int count);  
}  

Этот же метод с использованием TAP предоставит такой метод ReadAsync:The TAP counterpart of this method would expose the following single ReadAsync method:

public class MyClass  
{  
    public Task<int> ReadAsync(byte [] buffer, int offset, int count);  
}  

Аналог EAP будут предоставлять следующий набор типов и членов:The EAP counterpart would expose the following set of types and members:

public class MyClass  
{  
    public void ReadAsync(byte [] buffer, int offset, int count);  
    public event ReadCompletedEventHandler ReadCompleted;  
}  

Этот же метод с APM предоставит методы BeginRead и EndRead:The APM counterpart would expose the BeginRead and EndRead methods:

public class MyClass  
{  
    public IAsyncResult BeginRead(  
        byte [] buffer, int offset, int count,   
        AsyncCallback callback, object state);  
    public int EndRead(IAsyncResult asyncResult);  
}  

См. такжеSee also