【问题标题】:Why Wait for Asynchronous Web Services Calls为什么要等待异步 Web 服务调用
【发布时间】:2009-10-15 03:31:48
【问题描述】:

我正在浏览有关 WebServices 的 MSDN 文档。 Herehere,这两个链接都在谈论调用 web 服务并等待响应,这也是我在异步实现时看到的普遍趋势。

我不明白“为什么我们需要等待服务调用返回”?而且,如果我们正在等待,为什么不进行同步调用。 “异步调用后等待”和“同步调用”有什么区别?

【问题讨论】:

    标签: c# .net asp.net web-services asynchronous


    【解决方案1】:

    为了有用,异步调用需要在你去做其他事情的同时做它的事情。有两种方法可以做到这一点:

    1. Provide a callback method for the asynchronous handle, so that it can notify you when it is completed, or

    2. Periodically check the asynchronous handle to see if its status has changed to "completed."

    你不会使用 WaitHandle 来做这两件事。但是,WaitHandle 类使客户端可以进行异步调用并等待:

    • 单个 XML Web 服务 (WaitHandle.WaitOne),
    • 许多 XML Web 服务中的第一个 (WaitHandle.WaitAny),或
    • 所有许多 XML Web 服务 (WaitHandle.WaitAll)

    返回结果。

    换句话说,如果您在返回多个结果的异步 Web 服务上使用 WaitOneWaitAny,您可以从您的 Web 服务调用中获取单个结果,并在等待时处理它剩下的结果

    【讨论】:

    • 这就是我感到困惑的地方。我了解异步调用的必要性,但是在拨打电话后等待会破坏整个目的。事实上,我相信我们执行 ASP.NET 页面异步调用的默认方式也会使应用程序等待它得到响应。我会尝试查找更多信息并在此处发布。
    • @Robert/@Brian:所以你建议一次打多个电话。我如何知道服务器已准备好同时处理呼叫,或者它是否会阻塞网络或服务器?我们这里没有使用消息队列。
    • 那么回调或轮询方法可能比 WaitOne 或 WaitAny 更适合您。
    • 好的。我想知道 WSE 是否为异步处理提供任何附加功能。
    • WSE 3.0 的文档似乎表明它支持这种消息队列:msdn.microsoft.com/en-us/library/ms996942.aspx
    【解决方案2】:

    异步调用的一个非常实际的用途是这样的

    http://i.msdn.microsoft.com/Bb760816.PB_oldStyle%28en-us,VS.85%29.png

    如果您想在等待“服务器”执行某项操作时更新您的 UI,您需要进行异步调用。如果您进行同步调用,您的代码将是卡住等待,但如果您进行异步调用,您可以更新 UI,甚至在您等待回调时让用户去做其他事情。这超出了 UI,您可以进行异步调用以启动一些非关键任务并继续执行您的代码,如果结果不重要,您甚至可能不注册回调。

    如果你在等待异步调用时什么都不做,那么它的用处就会降低。

    【讨论】:

    • 这是有道理的。因为如果我在这种情况下进行同步调用,应用程序将超时。因此,异步调用将允许我们在向用户显示进度条的同时等待响应。如果可能的话,您能否发布一些具有类似实现的有用链接(或者我也可以谷歌搜索)。谢谢。
    • 这一切都取决于您正在做的开发(win forms、web、silverlight?)虽然只是在 google 的 pg 1 http://msdn.microsoft.com/en-us/library /aa480520.aspx
    【解决方案3】:

    使用异步调用可以让您的应用程序在等待响应时腾出时间来做其他事情。由于等待 Web 服务器响应的时间相当长(以计算机周期计),因此该时间可用于更好的事情,例如显示状态更新或做一些其他工作。

    例如,如果您有一个执行复杂计算的程序,并且该计算的一个步骤包括使用来自远程 Web 服务的一些参考数据。通过在计算开始时异步调用 Web 服务,继续可以在本地执行的计算部分,然后在可用时使用 Web 服务调用的结果来完成计算,您可以减少计算的总时间计算。

    由于您的应用程序代码没有阻塞等待 Web 服务响应,因此您可以利用该等待时间为用户谋取利益。

    另一个原因是扩展,尤其是在调用其他 Web 服务的网站中。通过使用异步页面方法(或任务),IIS 可以通过将等待异步 Web 请求的页面推迟到所谓的“IO 线程”来更有效地扩展应用程序,从而释放主 ASP.NET 工作线程以提供更多服务网页。

    【讨论】:

    • 对 result.AsyncWaitHandle.WaitOne() 的调用是否会阻止应用程序,从而破坏了重点?我想这就是@noob2487 的意思。
    • 您不必立即调用它。你也不必阻塞你的线程。您可以使用 Page.RegisterAsyncTask,也可以使用 [WebMethod] 的 BeginXXX/EndXXX 语法,让 ASP.NET 为您等待。
    【解决方案4】:

    您要链接的第一个示例发出异步调用,然后立即等待结果。据我所知,除了将工作分叉到另一个线程之外,这与同步调用几乎没有区别。

    然而,另一个例子是关于一次执行多个异步调用。如果是这种情况,启动所有调用然后等待是有意义的,因为调用可能并行执行。

    【讨论】:

    • 我明白你在说多个异步调用,但这是否仍然意味着每个调用者都必须等待?
    • 您可以从一个线程启动多个调用,然后等待这些调用返回。
    • 您确实可以启动多个并使用 WaitHandle.WaitAll() 进行一次等待,等待所有请求完成。
    【解决方案5】:

    异步调用后跟等待的一种可能用途是异步操作通常支持取消,而阻塞调用不支持。结合 .NET 4.0 中的 CancellationToken 模式(或 .NET4 之前的类似自定义模式),您可以创建一个看似同步但可以轻松取消的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-04
      • 2016-02-24
      • 1970-01-01
      • 2013-03-17
      相关资源
      最近更新 更多