Ответ 1
Модель асинхронного программирования (APM) - это модель, которую вы видите с парами BeginMethod(...)
и EndMethod(...)
.
Например, здесь Socket
используется реализация APM:
var socket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
// ...
socket.BeginReceive(recvBuffer, 0, recvBuffer.Length,
SocketFlags.None, ReceiveCallback, null);
void ReceiveCallback(IAsyncResult result)
{
var bytesReceived = socket.EndReceive(result);
if (bytesReceived > 0) { // Handle received data here. }
if (socket.Connected)
{
// Keep receiving more data...
socket.BeginReceive(recvBuffer, 0, recvBuffer.Length,
SocketFlags.None, ReceiveCallback, null);
}
}
Асинхронный шаблон на основе событий (EAP) - это модель, которую вы видите с парами MethodAsync(...)
и CancelAsync(...)
. Обычно есть событие Completed
. BackgroundWorker
- хороший пример этого шаблона.
Начиная с С# 4.5, оба были заменены шаблоном async/await
, который использует библиотеку Task Parallelism (TPL). Вы увидите их, отмеченные Async
после имени метода и обычно возвращающие ожидаемые Task
или Task<TResult>
. Если вы можете настроить таргетинг на .NET 4.5, вы обязательно должны использовать этот шаблон для проекта APM или EAP.
Например, сжатие (потенциально большого) файла асинхронно:
public static async Task CompressFileAsync(string inputFile, string outputFile)
{
using (var inputStream = File.Open(inputFile, FileMode.Open, FileAccess.Read))
using (var outputStream = File.Create(outputFile))
using (var deflateStream = new DeflateStream(outputStream, CompressionMode.Compress))
{
await inputStream.CopyToAsync(deflateStream);
deflateStream.Close();
outputStream.Close();
inputStream.Close();
}
}