回答
的异步编程模型(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
,并且通常返回等待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();
}
}
从客户端代码POV:
EAP:您设置的事件处理程序的事件,其名称中的“完成结束“然后调用名称以”异步“结尾的方法。您有时可以通过名称中的“取消”来调用可能会取消它的方法。
APM:您调用名称以“Begin”开头的方法,然后轮询其结果或接收回调,然后调用以“End”开头的方法。
据我所知,APM是在大多数BCL IO类和WCF中实现的,主要是低级别的不可删除操作(因为取消你只是忽略结果)。 EAP可以在更高级的类上找到,即下载文件,其中有多个步骤和某种有意义的取消行为。因此,如果您需要选择要执行的操作(并且您故意将自己限制为这两个操作),那么我认为它对您所做的操作是可以取消或不可以的。
从客户端代码POV你不总是得到一个选择。如果可以,最好使用C#4.5任务,他们可以通过包装器使用任何旧的异步机制。
在MSDN文章"Deciding When to Implement the Event-based Asynchronous Pattern"上给出了全面的答案。
这篇文章(和简短的回答你的问题)的主要想法听起来像“默认生成的基于事件的模式,同时可以选择生成的IAsyncResult模式”
- 1. Silverlight EAP vs APM到WCF服务
- 2. APM模式,等待异步
- 3. 线程vs begininvoke vs异步
- 4. 异步/的await,TAP和EAP
- 5. 从异步编程模型(APM)转移到基于任务的异步模式(TAP)
- 6. 异步编程
- 7. 性能:异步vs线程
- 8. ASP.NET - 异步编程
- 9. 异步编程JAVA
- 10. 异步编程使用异步/等待
- 11. 使用异步编程捕捉异议
- 12. 异步任务VS异步无效
- 13. 异步Ajax vs异步属性
- 14. 异步VS iPhone上
- 15. 异步RestFul vs Websocket
- 16. Axum vs TPL,异步
- 17. 并行编程异步编程
- 18. C#中的异步编程#
- 19. 异步黑盒编程
- 20. 蟒蛇异步Socket编程
- 21. jQuery异步编程模式?
- 22. 混淆异步编程
- 23. 任务异步c#编程
- 24. 不等待异步编程?
- 25. 异步编程问题
- 26. C++ select异步编程
- 27. ThreadPool.QueueUserWorkItem和异步编程
- 28. 异步套接字编程
- 29. Java的异步编程
- 30. JavaScript的异步编程
的[MSDN文档(HTTP: //msdn.microsoft.com/en-us/library/jj152938.aspx)涵盖了这一点。 –
伟大的文章!绝对添加到我的书签收藏中。 – Erik