首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步TaskCompletionSource调用方法两次

异步TaskCompletionSource调用方法两次
EN

Stack Overflow用户
提问于 2012-09-07 17:28:43
回答 1查看 1.6K关注 0票数 4

使用找到这条路使用await调用带有回调的异步方法,我在Argotic读取器库中使用了它:

代码语言:javascript
复制
var tcs = new TaskCompletionSource<string>();

EventHandler<SyndicationResourceLoadedEventArgs> feedReaderOnLoaded = null;
feedReaderOnLoaded = (sender, args) =>
                {
                    feedReader.Loaded -= feedReaderOnLoaded;
                    tcs.SetResult(""); // Needed so the await completes
                };
feedReader.Loaded += feedReaderOnLoaded;
feedReader.LoadAsync(new Uri(feed.Url), new object());

await tcs.Task;

// Result is put in a property, rather than returned from the method
var items = feedReader.Channel.Items;

所以效果很好,我拿到了我的东西。

我在Fiddler中注意到,正在给RSS提要的网址打两个电话。在调试器中遍历代码时,在LoadAsync上调用一次,在await tcs.Task上调用一次。我该怎么做才能消除其中一个电话?

更新有一个控制台应用程序项目可以是从这里下载,它演示了这种行为。

更新--我改变了使用Argotic库的方式,以便使用HttpClient下载RSS,然后将内容作为字符串传递给Argotic,该字符串现在只生成一个调用。如果有人有任何想法,我还是想知道为什么叫两次。

EN

回答 1

Stack Overflow用户

发布于 2013-08-16 12:17:40

看起来它是馈电阅读器异步API中的一个bug/特性。

它执行一个异步WebRequest来获取提要。但是,当它处理WebRequest完成时,它为响应创建一个XmlReader,但实际上使用:SyndicationEncodingUtility.CreateSafeNavigator(Url, new WebRequestOptions(), null),它再次(同步地)从源Url读取它。

提要本身将被第二次缓存,因此不会造成巨大的开销。

认为可以通过将响应流传递给CreateSafeNavigator来修复它,但是也许读取响应流也可以从异步操作中受益。

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

https://stackoverflow.com/questions/12322758

复制
相关文章

相似问题

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