AsyncCallBack异步完成

Jon*_*dén 15 .net c# silverlight web-services

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

IAsyncResult channelOpenResult = channel.BeginOpen(new AsyncCallback(OnOpenCompleteChannel), channel);
if (channelOpenResult.CompletedSynchronously)  
{  
    CompleteOpenChannel(channelOpenResult);  
}
Run Code Online (Sandbox Code Playgroud)

然后,在回调中:

void OnOpenCompleteChannel(IAsyncResult result)  
{  
    if (result.CompletedSynchronously)  
        return;  
    else  
        CompleteOpenChannel(result);  
}
Run Code Online (Sandbox Code Playgroud)

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

void CompleteOpenChannel(IAsyncResult result) ...
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*ian 8

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