[...] Async和Begin [...] .net异步API之间的区别

时间:2010-06-20 21:53:32

标签: .net .net-3.5 sockets asynchronous

任何人都可以解释一下Begin [...] / End [...]异步API模式与.NET 3.5中后来的异步模式有什么区别?

  • 为什么后来被创造了?
  • 为什么人们更喜欢一种模式呢?

例如,Socket.BeginAccept()和Socket.AcceptAsync()。

2 个答案:

答案 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)

MSDN会比我更好地回答:

http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx

  

这些增强功能的主要特点   是避免重复   分配和同步   高容量期间的物体   异步套接字I / O.开始/结束   目前实施的设计模式   由System.Net.Sockets.Socket类   需要一个System.IAsyncResult对象   为每个异步分配   套接字操作。