4

找到这种使用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 进行了两次调用。在调试器中单步执行代码时,它会被调用一次 on LoadAsync,然后再次 on await tcs.Task。我应该怎么做才能消除其中一个电话?

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

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

4

1 回答 1

1

看起来这是供稿阅读器的异步 API 中的错误/功能。

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

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

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

于 2013-08-16T12:17:40.263 回答