任何人都可以解釋我Begin [...]/End異步API模式和後來.NET 3.5中的異步模式?Async和Beginnet異步API之間的差異
- 爲什麼後來創建?
- 爲什麼人們會喜歡另一種模式?
例如,Socket.BeginAccept()和Socket.AcceptAsync()。
任何人都可以解釋我Begin [...]/End異步API模式和後來.NET 3.5中的異步模式?Async和Beginnet異步API之間的差異
例如,Socket.BeginAccept()和Socket.AcceptAsync()。
MSDN將回答這個比我更好:
http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx
這些增強功能 的主要特點是大批量 異步套接字在反覆 分配和 對象同步的迴避I/O。當前實現的開始/結束 設計模式 由System.Net.Sockets.Socket類 要求爲每個異步 套接字操作分配一個System.IAsyncResult對象 。
注意,大多數方法*Async
(相應*Completed
事件)所使用的Event-Based Asynchronous Pattern。較舊的(但仍是完全有效的)Begin*
和End*
是一種稱爲Asynchronous Programming Model的模式。 Socket
類是此規則的例外;其*Async
方法沒有任何相應的事件;它基本上只是以避免過多的內存分配的方式完成的APM。
APM和EBAP最大的區別是用於完成通知的線程。 APM將回調一個線程池線程(除非請求同步完成)。 EBAP將使用跨框架策略在UI線程上回調(如果該操作是從UI線程開始的)。
但是,基於Task Parallel Library,APM和EBAP正在被更爲靈活的方法取代。由於TPL可以輕鬆包裝APM,因此舊版的課程可能不會直接更新;擴展方法用於爲舊的APM方法提供等效的Task
。
更新2012-07-14:我錯了,當我說「老班可能不會直接更新」。出於性能原因,BCL/TPL團隊決定檢查每個BCL類型並直接添加TAP方法,而不是使用擴展方法。這些更改將在.NET 4.5中進行。