【问题标题】:AsyncCallBack CompletedSynchronouslyAsyncCallBack 同步完成
【发布时间】:2009-09-03 08:08:05
【问题描述】:

我最近注意到以下模式,但我并不完全掌握 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);  
}

在代码的某处当然有一个函数:

void CompleteOpenChannel(IAsyncResult result) ...

这是一种根据异步调用是否直接完成而以不同方式处理异步调用的方法吗?但是为什么在这种情况下使用它,因为 AsyncCallback 总是会被调用(会吗?)? 有人可以举一个同步进行调用的例子吗?

【问题讨论】:

    标签: c# .net silverlight web-services


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多