0

Ye Olde Add Web Reference 生成对服务的 XXXAsync 调用,这些调用使用事件来通知调用者调用已完成。

在 WPF 或控制台应用程序中添加服务引用,当被告知生成异步操作时,使用 IAsyncResult 设计模式(BeginXXX 和 EndXXX 操作)。我的理解是,这通常被认为是可用性和灵活性方面的一个进步——你可以使用回调,只需调用 EndXXX 就可以在任何时间点开始阻塞,你可以分组等待句柄并阻塞一组操作,你可以投票等。

为什么 Silverlight 中的 ASR 不使用 IAsyncResult?我的猜测是因为设计人员想要非常清楚地表明,实际上需要完全异步,如果他们使用了 IAsyncResult 设计模式,那么尝试只调用 Begin 紧跟 End 就太容易了,这会使对于大约 100% 的新开发人员或没有很好地掌握异步的人来说,这是一个绊脚石。

4

2 回答 2

5

Silverlight 团队提供了对基于事件的异步模式的即时访问,因为它是一种更易于使用的方法(但不太灵活)。例如,在显示线程中触发事件,让不愿考虑他们的线程模型的开发人员忘记它。

如果您(如我)需要更好的灵活性,Silverlight 也可以使用 Begin/End 异步模式。事实上,基于事件的生成代码是基于 IAsyncResult 的。

您生成的 Channel 接口定义了开始/结束方法,您可以使用通道工厂来获取该接口的可用实现。

于 2011-03-21T23:33:01.663 回答
2

来自MSDN

通常,前面描述的基于事件的异步模型在调用服务的同一线程上引发完成事件。这在许多应用程序中很方便,因为您经常从 UI(用户界面)线程调用服务,并且可以直接在完成事件处理程序中更新 UI 组件(例如我们示例中的文本框)。

有时,您可能希望在后台线程上处理完成事件。出于这个或其他原因,您可能希望使用基于 IAsyncResult 机制和 Begin/End 方法的替代异步调用模型。

要使用此模型,您必须首先将代理转换为适当的接口类型。接口类型由添加服务引用工具与代理一起自动生成。然后,您可以调用适当的 Begin 方法。

CopyIAsyncResult iar = ((CustomerService)proxy).BeginGetUser(userId, GetUserCallback, proxy);

感谢 Kimberly 提供的 MSDN 链接。

于 2011-03-21T23:37:54.580 回答