异步Web服务调用是否始终调用AsyncCallback?

我正在从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”没有抛出exception,我可以确定MyCallback会被执行吗? 我在BeginXXX函数返回的IAsyncResult上看到“CompletedSynchronously”和“IsCompleted”,但我不确定这是否重要。

是的,保证会调用回调。 回调是允许使用Begin* / End*模式的异步代码以延续传递方式编写的。

但是,必须在回调中调用相应的End*方法(通常是回调中的第一个)。 这是异步方法如何表示在调用期间可能发生的exception,以及获得结果的方式(如果有的话)。

使用C#2.0时使用匿名委托对异步模式进行编码有时会更加优雅,并且允许在呼叫启动时写入呼叫后延续,并允许通过捕获的变量更容易地共享数据,从而提供适当的同步措施使用。

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

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

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

[…]

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

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