Ye Olde添加Web引用会对使用事件的服务生成XXXAsync调用,以通知调用方该调用已完成。
在WPF或控制台应用程序中添加服务引用,当被告知生成异步操作时,使用IAsyncResult设计模式(BeginXXX和EndXXX操作)。我的理解是,这通常被认为是可用性和灵活性的一个进步 - 您可以使用回调,您可以通过调用EndXXX在任何时间点开始阻止,您可以对等待句柄进行分组并阻止一组操作,你可以投票等。
为什么Silverlight中的ASR不使用IAsyncResult?我的猜测是因为设计师想要非常清楚地表明事实上需要完全异步性,并且如果他们使用了IAsyncResult设计模式,那么尝试只是调用Begin然后紧跟End就太容易了,这本来就是对于一个绊脚石,大约100%的新开发者或者没有很好地掌握异步的人会受到打击。
答案 0 :(得分:5)
Silverlight团队提供了对基于事件的异步模式的即时访问,因为它是一种更易于使用的方法(但灵活性要低得多)。例如,事件在显示线程中触发,允许开发人员不愿意考虑他们的线程模型而忘记它。
如果您需要更好的灵活性(就像我一样),也可以为Silverlight提供Begin / End异步模式。事实上,基于事件的生成代码基于IAsyncResult。
您生成的Channel接口定义了开始/结束方法,您可以使用channel factory来获取接口的可用实现。
答案 1 :(得分:2)
来自MSDN:
通常,前面描述的基于事件的异步模型会在调用服务的同一线程上引发完成事件。这在许多应用程序中都很方便,因为您经常从UI(用户界面)线程调用服务,并且可以直接在完成事件处理程序中更新UI组件(例如我们示例中的文本框)。
有时,您可能希望在后台线程上处理完成事件。出于此原因或其他原因,您可能希望使用基于IAsyncResult机制和Begin / End方法的备用异步调用模型。
要使用此模型,必须先将代理转换为适当的接口类型。接口类型由添加服务引用工具自动与代理一起生成。然后,您可以调用相应的Begin方法。
CopyIAsyncResult iar = ((CustomerService)proxy).BeginGetUser(userId, GetUserCallback, proxy);
感谢Kimberly提供的MSDN链接。