AsyncCallBack异步完成

我最近注意到了以下模式,但我并没有完全掌握CompletedSynchronously属性的用法:

IAsyncResult channelOpenResult = channel.BeginOpen(new AsyncCallback(OnOpenCompleteChannel), channel); if (channelOpenResult.CompletedSynchronously) { CompleteOpenChannel(channelOpenResult); } 

然后再次回调:

 void OnOpenCompleteChannel(IAsyncResult result) { if (result.CompletedSynchronously) return; else CompleteOpenChannel(result); } 

代码中的某个地方当然有一个function:

 void CompleteOpenChannel(IAsyncResult result) ... 

这是一种处理异步调用的方式,具体取决于它是否直接完成? 但是为什么在这种情况下使用它,因为始终会调用AsyncCallback(它会吗?)? 有人可以给出一个同步调用的例子吗?

看到这个博客 。 一个常见的模式在循环中执行异步工作,并且检查CompletedSynchronously有助于避免出现“不幸”的情况,并且一堆异步调用恰好完成同步,并且您冒着StackOverflowException的风险。 (例如,如果您正在通过网络读取数据,并且您正在读取的数据已经通过网络进行缓冲,则您的异步调用可能会同步完成,这意味着您的回调会在同一个线程上调用(具有更高的值) stack),这意味着你最好不要在循环中安排另一个异步调用。)

根据此文档,您可以使用同步和ASync回调提供调用,并且只有在未同步处理调用时,它才会调用ASync方法。 我认为这不适用于Silverlight(因为所有Silverlight调用都在某种程度上是异步),但可能更多地用于其他.NET应用程序中的自定义工厂。

希望这可以帮助。