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

Pav*_*sky 16 .net sockets asynchronous .net-3.5

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

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

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

Ste*_*ary 17

请注意,大多数*Async方法(具有相应的*Completed事件)都使用基于事件的异步模式.较旧(但仍然完全有效)Begin*并且End*是一种称为异步编程模型的模式.Socket课程是这个规则的一个例外; 它的*Async方法没有任何相应的事件; 它本质上只是APM以避免过多内存分配的方式完成的.

APM和EBAP之间的最大区别是用于完成通知的线程.APM将回调线程池线程(除非请求同步完成).EBAP将使用跨框架策略来回调UI线程(如果操作是从UI线程启动的).

但是,APM和EBAP都被基于任务并行库的更灵活的方法所取代.由于TPL可以轻松地包装APM,因此较旧的类可能不会直接更新; 扩展方法用于Task为旧的APM方法提供等价物.

更新2012-07-14:当我说"旧课程可能不会直接更新"时,我错了.出于性能原因,BCL/TPL团队决定审核每个BCL类型并直接添加TAP方法,而不是使用扩展方法.这些更改将在.NET 4.5中进行.


Jul*_*ain 11

MSDN会比我更好地回答:

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

这些增强功能的主要特征是避免在高容量异步套接字I/O期间重复分配和同步对象.当前由System.Net.Sockets.Socket类实现的Begin/End设计模式需要为每个异步套接字操作分配System.IAsyncResult对象.