首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AsyncCallBack CompletedSynchronously

AsyncCallBack CompletedSynchronously
EN

Stack Overflow用户
提问于 2009-09-03 08:08:06
回答 2查看 7.4K关注 0票数 15

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

代码语言:javascript
复制
IAsyncResult channelOpenResult = channel.BeginOpen(new AsyncCallback(OnOpenCompleteChannel), channel);
if (channelOpenResult.CompletedSynchronously)  
{  
    CompleteOpenChannel(channelOpenResult);  
}

然后,在回调中:

代码语言:javascript
复制
void OnOpenCompleteChannel(IAsyncResult result)  
{  
    if (result.CompletedSynchronously)  
        return;  
    else  
        CompleteOpenChannel(result);  
}

当然,在代码中的某个地方有一个函数:

代码语言:javascript
复制
void CompleteOpenChannel(IAsyncResult result) ...

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-03 09:14:16

参见this blog。一种常见的模式是在一个循环中进行异步工作,检查CompletedSynchronously有助于避免出现“倒霉”、大量异步调用恰好完成同步并冒着StackOverflowException风险的情况。(例如,如果您正在通过网络读取数据,并且您正在读取的数据已经通过网络到达并被缓冲,则异步调用可能会同步完成,这意味着您的回调是在同一线程上调用的(具有更高的堆栈),这意味着您最好不要在循环中调度另一个异步调用。)

票数 8
EN

Stack Overflow用户

发布于 2009-09-03 08:41:11

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

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1372053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档