Поделиться через


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

.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);  
}  

См. также