我正在从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",但我不确定这是否重要.
是的,保证会调用回调.回调是允许使用Begin*
/ End*
pattern以异步传递方式编写的异步代码 .
但是,您必须End*
在回调中调用相应的方法(通常是回调中的第一个方法).这是异步方法如何表示在调用期间可能发生的异常,以及获得结果的方式(如果有的话).
使用C#2.0时使用匿名委托对异步模式进行编码有时更加优雅,并允许在呼叫启动时写入呼叫后延续,并允许通过捕获的变量更容易地共享数据,从而提供适当的同步措施使用.
参考: http://msdn.microsoft.com/en-us/library/ms228972.aspx:
在等待异步操作的结果时可以执行其他工作的应用程序不应阻止等待操作完成.在等待异步操作完成时,使用以下选项之一继续执行指令:
使用AsyncCallback委托在单独的线程中处理异步操作的结果.本主题演示了此方法.
[...]