回答
的異步編程模型(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