【问题标题】:Do asynchronous web service calls always call the AsyncCallback?异步 Web 服务调用是否总是调用 AsyncCallback?
【发布时间】:2009-03-11 18:18:10
【问题描述】:

我正在从 C# 应用程序进行异步 Web 服务调用:

{
  //Put UI in 'loading' state
  ...

  //Now call web service
  webServiceProxy.BeginMyMethod(param, new AsyncCallback(MyCallback), null);
}


private void MyCallback(IAsyncResult res)
{
   ...
   //process result

   // Put UI back in normal state (yes I'm marshalling back to the UI thread)
}

主线程将应用置于“等待”模式,然后回调函数结束重新启用控件。我看到一个错误,即 UI 偶尔会永远卡在加载模式中。

现在回调代码中可能只是一个错误(那里有很多),但我在这里向社区提出的问题是:

是否保证会调用“MyCallback”?假设“BeginMyMethod”没有抛出异常,我可以确定 MyCallback 会被执行吗?我在 BeginXXX 函数返回的 IAsyncResult 上看到“CompletedSynchronously”和“IsCompleted”,但我不确定这是否重要。

【问题讨论】:

    标签: c# .net web-services


    【解决方案1】:

    是的,回调一定会被调用。回调允许使用 Begin* / End* 模式的异步代码以连续传递样式编写。

    但是,您必须在回调中调用相应的End* 方法(通常是回调中的第一件事)。这是异步方法如何发出调用期间可能发生的异常的信号,一方面,以及获取结果的方式(如果有的话)。

    在使用 C# 2.0 时使用匿名委托来编写异步模式有时会更优雅,并且允许在调用开始时编写调用后延续,并允许通过捕获的变量更轻松地共享数据,前提是使用了适当的同步措施。

    参考:http://msdn.microsoft.com/en-us/library/ms228972.aspx

    在等待异步操作结果时可以执行其他工作的应用程序不应阻塞等待,直到操作完成。使用以下选项之一在等待异步操作完成时继续执行指令:

    • 使用 AsyncCallback 委托在单独的线程中处理异步操作的结果。本主题演示了这种方法。

    [...]

    【讨论】:

    • 您是否知道 MSDN 上的任何参考资料或任何说明。我的印象是这就是它的工作方式,但我从未发现任何确认是的,这是有保证的。所有 MSDN 示例都有主线程在检查 IsComplete 的 while 循环中无用地旋转。
    • 我已经用参考更新了我的答案,其中还包括一个明确使用 AsyncCallback 委托的示例。但是,它是以 C# 1.0 的风格编写的;现在更惯用的是使用匿名委托。
    【解决方案2】:

    无论操作是同步完成还是异步完成,都会调用 AsyncCallback。

    【讨论】:

      【解决方案3】:

      我相信如果 CompletedSynchronously 属性为 true,则不能保证调用回调。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 2011-09-03
        • 1970-01-01
        • 2010-10-10
        相关资源
        最近更新 更多