我觉得很多课程(例如TcpClient
,UdpClient
,HttpListener
)如果是事件驱动的话会更容易理解和使用。并且IAsyncResult
模式实现起来非常困难,因为它可以让您了解各种奇怪的用例:
等等。尽管如此,微软还是选择在大多数地方使用它。为什么呢?
编辑:请将讨论重点放在.NET 2.0上,因为这是我必须使用的内容。
答案 0 :(得分:6)
等等。尽管如此,微软还是选择在大多数地方使用它。为什么呢?
使用IAsyncResult
的异步模式是Framework中使用的原始异步编程模式。它没有什么优势,而且复杂性导致了新的模式随着时间的推移而发展。
事件异步编程(EAP)稍后介绍(其中您有一个带有完成事件的“Begin”方法)。这解决了很多复杂性,但在许多情况下仍然很难使用,因为你必须将逻辑分成多种方法。
但是,当前的异步模式基于.NET 4的Task
和Task<T>
类,并提供了巨大的优势,特别是在与C#5的异步/等待支持相结合时。幸运的是,TaskFactory.FromAsync可用于轻松地将基于IAsyncResult
的异步方法对自动包装到Task<T>
中,因此可以使用新模式。 .NET 4.5添加了许多框架的异步方法的新版本,这些方法返回Task<T>
,因此新的async
/ await
语言支持可以与框架方法一起使用。这是所有异步编程的首选方法。
答案 1 :(得分:3)
这种模式没有很多优点。
在.Net 1.0中,在泛型和lambda表达式之前,这是唯一可用的异步模式。
更现代的基于任务的模式由于多种原因而更加出色,包括类型安全性,更简单的错误处理,延续,When*()
方法等。