加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 异步TaskCompletionSource调用方法两次

发布时间:2020-12-15 21:40:03 所属栏目:百科 来源:网络整理
导读:有 found this way使用等待通过回调调用异步方法,我在Argotic RSS阅读器库上使用它: var tcs = new TaskCompletionSourcestring();EventHandlerSyndicationResourceLoadedEventArgs feedReaderOnLoaded = null;feedReaderOnLoaded = (sender,args) = { feed
有 found this way使用等待通过回调调用异步方法,我在Argotic RSS阅读器库上使用它:

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 feed的url进行调用.单步执行调试器中的代码后,会在LoadAsync上调用一次,并再次等待tcs.Task.我应该怎么做才能消除其中一个电话?

更新有一个控制台应用程序项目,可以是downloaded from here,演示此行为.

更新我已经改变了我使用Argotic库的方式,因此我使用HttpClient下载RSS提要,然后将内容作为字符串传递给Argotic,现在只生成一个调用.如果有人有任何想法,我仍然想知道为什么它会被召唤两次.

解决方法

看起来它是 feed reader的Async API中的错误/功能.

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

Feed本身将在第二次缓存,因此不会造成巨大的开销.

认为可以通过将响应流传递给CreateSafeNavigator来修复它,但也许读取响应流也可以从异步完成中获益.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读