任何人都可以解释一下Begin [...] / End [...]异步API模式与.NET 3.5中后来的异步模式有什么区别?
例如,Socket.BeginAccept()和Socket.AcceptAsync()。
答案 0 :(得分:16)
请注意,大多数*Async
方法(包含相应的*Completed
个事件)都在使用Event-Based Asynchronous Pattern。较早(但仍然完全有效)的Begin*
和End*
是一种称为Asynchronous Programming Model的模式。 Socket
类是此规则的例外;其*Async
方法没有任何相应的事件;它本质上只是以避免过多内存分配的方式完成APM。
APM和EBAP之间的最大区别是用于完成通知的线程。 APM将回调线程池线程(除非请求同步完成)。 EBAP将使用跨框架策略来回调UI线程(如果操作是从UI线程启动的)。
然而,APM和EBAP都被基于Task Parallel Library的更灵活的方法所取代。由于TPL可以轻松地包装APM,因此较旧的类可能不会直接更新;扩展方法用于为旧的APM方法提供Task
等价物。
更新2012-07-14:当我说“旧课程可能不会直接更新”时,我错了。出于性能原因,BCL / TPL团队决定审核每个BCL类型并直接添加TAP方法,而不是使用扩展方法。这些更改将在.NET 4.5中进行。
答案 1 :(得分:12)
http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx
这些增强功能的主要特点 是避免重复 分配和同步 高容量期间的物体 异步套接字I / O.开始/结束 目前实施的设计模式 由System.Net.Sockets.Socket类 需要一个System.IAsyncResult对象 为每个异步分配 套接字操作。