gpt4 book ai didi

c# - 异步编程 APM 与 EAP

转载 作者:IT王子 更新时间:2023-10-29 04:34:36 24 4
gpt4 key购买 nike

异步编程模型基于事件的异步模式之间究竟有什么区别?

什么时候使用哪种方法?

最佳答案

异步编程模型 (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是这种模式的一个很好的例子。

C# 4.5 开始,两者都已被 async/await 取代模式,它使用任务并行库 (TPL)。您会看到它们标有 Async在方法名称之后,通常返回一个 awaitable TaskTask<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();
}
}

关于c# - 异步编程 APM 与 EAP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11276314/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com