gpt4 book ai didi

c# - Async TaskCompletionSource 调用方法两次

转载 作者:行者123 更新时间:2023-11-30 12:49:11 27 4
gpt4 key购买 nike

拥有found this way关于使用 await 调用带有回调的异步方法,我在 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 提要的 url 进行了两次调用。在调试器中逐步执行代码后,它会在 LoadAsync 上调用一次,然后在 await tcs.Task 上再次调用。我应该怎么做才能消除其中一个电话?

更新 有一个控制台应用程序项目可以是 downloaded from here这证明了这种行为。

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

最佳答案

看起来这是 feed reader 的异步 API 中的错误/功能.

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

Feed 本身将被缓存第二次,因此不会造成大量开销。

认为可以通过将响应流传递给 CreateSafeNavigator 来解决这个问题,但也许读取响应流也可以从异步完成中受益。

关于c# - Async TaskCompletionSource 调用方法两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12322758/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com