【发布时间】:2009-10-15 03:31:48
【问题描述】:
我正在浏览有关 WebServices 的 MSDN 文档。 Here 和 here,这两个链接都在谈论调用 web 服务并等待响应,这也是我在异步实现时看到的普遍趋势。
我不明白“为什么我们需要等待服务调用返回”?而且,如果我们正在等待,为什么不进行同步调用。 “异步调用后等待”和“同步调用”有什么区别?
【问题讨论】:
标签: c# .net asp.net web-services asynchronous
我正在浏览有关 WebServices 的 MSDN 文档。 Here 和 here,这两个链接都在谈论调用 web 服务并等待响应,这也是我在异步实现时看到的普遍趋势。
我不明白“为什么我们需要等待服务调用返回”?而且,如果我们正在等待,为什么不进行同步调用。 “异步调用后等待”和“同步调用”有什么区别?
【问题讨论】:
标签: c# .net asp.net web-services asynchronous
为了有用,异步调用需要在你去做其他事情的同时做它的事情。有两种方法可以做到这一点:
你不会使用 WaitHandle 来做这两件事。但是,WaitHandle 类使客户端可以进行异步调用并等待:
WaitHandle.WaitOne),WaitHandle.WaitAny),或WaitHandle.WaitAll) 返回结果。
换句话说,如果您在返回多个结果的异步 Web 服务上使用 WaitOne 或 WaitAny,您可以从您的 Web 服务调用中获取单个结果,并在等待时处理它剩下的结果。
【讨论】:
异步调用的一个非常实际的用途是这样的
http://i.msdn.microsoft.com/Bb760816.PB_oldStyle%28en-us,VS.85%29.png
如果您想在等待“服务器”执行某项操作时更新您的 UI,您需要进行异步调用。如果您进行同步调用,您的代码将是卡住等待,但如果您进行异步调用,您可以更新 UI,甚至在您等待回调时让用户去做其他事情。这超出了 UI,您可以进行异步调用以启动一些非关键任务并继续执行您的代码,如果结果不重要,您甚至可能不注册回调。
如果你在等待异步调用时什么都不做,那么它的用处就会降低。
【讨论】:
使用异步调用可以让您的应用程序在等待响应时腾出时间来做其他事情。由于等待 Web 服务器响应的时间相当长(以计算机周期计),因此该时间可用于更好的事情,例如显示状态更新或做一些其他工作。
例如,如果您有一个执行复杂计算的程序,并且该计算的一个步骤包括使用来自远程 Web 服务的一些参考数据。通过在计算开始时异步调用 Web 服务,继续可以在本地执行的计算部分,然后在可用时使用 Web 服务调用的结果来完成计算,您可以减少计算的总时间计算。
由于您的应用程序代码没有阻塞等待 Web 服务响应,因此您可以利用该等待时间为用户谋取利益。
另一个原因是扩展,尤其是在调用其他 Web 服务的网站中。通过使用异步页面方法(或任务),IIS 可以通过将等待异步 Web 请求的页面推迟到所谓的“IO 线程”来更有效地扩展应用程序,从而释放主 ASP.NET 工作线程以提供更多服务网页。
【讨论】:
您要链接的第一个示例发出异步调用,然后立即等待结果。据我所知,除了将工作分叉到另一个线程之外,这与同步调用几乎没有区别。
然而,另一个例子是关于一次执行多个异步调用。如果是这种情况,启动所有调用然后等待是有意义的,因为调用可能并行执行。
【讨论】:
异步调用后跟等待的一种可能用途是异步操作通常支持取消,而阻塞调用不支持。结合 .NET 4.0 中的 CancellationToken 模式(或 .NET4 之前的类似自定义模式),您可以创建一个看似同步但可以轻松取消的操作。
【讨论】: