День сто восемьдесят девятый. #ЗаметкиНаПолях

Многопоточность

7. Шаблоны Асинхронного Программирования

.NET предоставляет три шаблона для выполнения асинхронных операций:

1. Модель асинхронного программирования (APM), также называемый шаблоном IAsyncResult, является устаревшей моделью, использующей интерфейс IAsyncResult для обеспечения асинхронного поведения. В этом шаблоне для синхронных операций требуются методы Begin и End (например, BeginWrite и EndWrite для реализации асинхронной операции записи). Этот шаблон больше не рекомендуется для новых разработок. Например, рассмотрим метод Read, который считывает указанное количество данных в буфер, начиная с указанного смещения:

public class MyClass

{

public int Read(byte [] buffer, int offset, int count);

}

В APM нужно реализовать методы BeginRead и EndRead:

public class MyClass

{

public IAsyncResult BeginRead(

byte[] buffer, int offset, int count,

AsyncCallback callback, object state);

public int EndRead(IAsyncResult asyncResult);

}



2. Асинхронный шаблон на основе событий (EAP) является устаревшим шаблоном на основе событий для обеспечения асинхронного поведения. Для этого требуется метод с суффиксом Async и одно или несколько событий, делегатов обработчиков событий и типов, производных от EventArg. EAP был представлен в .NET Framework 2.0. Больше не рекомендуется для новых разработок. Для примера выше в EAP потребуется метод и событие:

public class MyClass

{

public void ReadAsync(byte[] buffer, int offset, int count);

public event ReadCompletedEventHandler ReadCompleted;

}



3. Асинхронный шаблон на основе задач (TAP) использует общий метод для инициирования и завершения асинхронной операции. TAP был представлен в .NET Framework 4. В настоящее время это рекомендуемый подход к асинхронному программированию в .NET. Языковую поддержку для TAP обеспечивают ключевые слова async и await в C#. Для примера выше в TAP потребуется реализация одного метода:

public class MyClass

{

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

}



Продолжение следует…



Источники:

- Джеффри Рихтер “CLR via C#”. 3-е изд. – СПб.: Питер, 2012. Глава 27.

-
https://docs.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/