代码之家  ›  专栏  ›  技术社区  ›  Clyde

异步Web服务调用是否总是调用AsyncCallback?

  •  1
  • Clyde  · 技术社区  · 17 年前

    我正在从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)
    }
    

    主线程将应用程序置于“等待”模式,然后回调函数的结尾重新启用控件。我看到一个bug,偶尔,用户界面会永远停留在加载模式中。

    现在回调代码中可能有一个bug(这里有很多),但我想问的是:

    “mycallback”是否保证被调用?假设“BeginMyMethod”没有引发异常,我可以确定将执行MyCallback吗?我在beginxxx函数返回的iasyncresult上看到“completedSynchronously”和“iscompleted”,但我不确定这是否重要。

    3 回复  |  直到 17 年前
        1
  •  5
  •   Barry Kelly    17 年前

    是的,保证会打回电话。回调允许异步代码使用 Begin* / End* 以连续传递样式书写的图案。

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

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

    裁判: http://msdn.microsoft.com/en-us/library/ms228972.aspx :

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

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

    […]

        2
  •  1
  •   Jim Mischel    17 年前

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

        3
  •  0
  •   John Saunders    17 年前

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