C# 为什么要等待异步Web服务调用

C# 为什么要等待异步Web服务调用,c#,.net,asp.net,web-services,asynchronous,C#,.net,Asp.net,Web Services,Asynchronous,我正在浏览有关Web服务的MSDN文档。而且,这两个链接都谈到调用Web服务并等待响应,这也是我在异步实现时看到的一个普遍趋势 我不明白“为什么我们需要等待服务呼叫返回”?如果我们正在等待,为什么不打一个同步电话呢。“异步调用后跟等待”和“同步调用”之间的区别是什么?使用异步调用可以让应用程序在等待响应时做其他事情。由于有相当长的时间(以计算机周期为单位)等待web服务器响应,因此这段时间可以用于更好的事情,例如显示状态更新或执行其他一些工作 例如,如果您有一个执行复杂计算的程序,并且该计算的一

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


我不明白“为什么我们需要等待服务呼叫返回”?如果我们正在等待,为什么不打一个同步电话呢。“异步调用后跟等待”和“同步调用”之间的区别是什么?

使用异步调用可以让应用程序在等待响应时做其他事情。由于有相当长的时间(以计算机周期为单位)等待web服务器响应,因此这段时间可以用于更好的事情,例如显示状态更新或执行其他一些工作

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

由于您的应用程序代码在等待web服务响应时不会被阻止,因此您可以利用该等待时间为用户带来好处


另一个原因是可伸缩性,特别是在调用其他web服务的网站中。通过使用异步页面方法(或任务),IIS可以更有效地扩展您的应用程序,方法是将等待异步web请求的页面延迟到所谓的“IO线程”,释放主要ASP.NET工作线程以服务更多的网页。

如果有用,异步调用需要在您执行其他操作时执行它的操作。有两种方法可以做到这一点:

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

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


    换句话说,如果在返回多个结果的异步web服务上使用
    WaitOne
    WaitAny
    ,则可以从web服务调用中获得单个结果,并在等待剩余结果时对其进行处理。

    您链接到的第一个示例发出异步调用,然后立即等待结果。除了将作业转移到另一个线程之外,据我所知,这与同步调用之间没有什么区别


    但是,另一个示例讨论了同时执行多个异步调用。如果是这种情况,启动所有调用然后等待是有意义的,因为调用可能并行执行

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

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


    如果在等待异步调用时什么也不做,那么它就没那么有用了。

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

    对result.AsyncWaitHandle.WaitOne()的调用是否会阻止应用程序,从而破坏了这一点?我想@noob2487就是这个意思。你不必马上打电话给它。您也不必阻塞线程。您可以使用Page.RegisterAsyncTask,也可以使用[WebMethod]的BeginXXX/EndXXX语法,让ASP.NET完成等待您的任务。我明白您对多个异步调用的看法,但这是否仍然意味着每个调用方都必须等待?您可以从一个线程启动多个调用,并等待这些调用返回。您确实可以启动多个调用,然后使用WaitHandle.WaitAll()进行一次等待,等待所有请求完成。这就是我感到困惑的地方。我理解异步调用的必要性,但在调用后等待会破坏整个目的。事实上,我相信我们进行ASP.NET页面异步调用的默认方式也会使应用程序等待,直到收到响应为止。我将尝试查找更多信息并在这里发布。@Robert/@Brian:所以你建议一次性拨打多个电话。我如何知道服务器已准备好同时处理呼叫,或者它是否会阻塞网络或服务器?我们这里不使用消息队列。那么回调或轮询方法可能比WaitOne或WaitAny更适合您。确定。我想知道WSE是否为异步处理提供了任何附加功能。WSE 3.0的文档似乎表明它支持这种消息队列:这很有意义。因为如果我在这种情况下进行同步调用,应用程序将超时。所以,异步调用将允许我们在向用户显示进度条的同时等待响应。如果可能的话,你可以发布一些类似实现的有用链接(或者我也可以用谷歌搜索它)。谢谢。这完全取决于你在做什么开发(WinForms、web、silverlight?),现在开始