使用找到这条路使用await调用带有回调的异步方法,我在Argotic读取器库中使用了它:
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,该字符串现在只生成一个调用。如果有人有任何想法,我还是想知道为什么叫两次。
发布于 2013-08-16 12:17:40
看起来它是馈电阅读器异步API中的一个bug/特性。
它执行一个异步WebRequest来获取提要。但是,当它处理WebRequest完成时,它为响应创建一个XmlReader,但实际上使用:SyndicationEncodingUtility.CreateSafeNavigator(Url, new WebRequestOptions(), null),它再次(同步地)从源Url读取它。
提要本身将被第二次缓存,因此不会造成巨大的开销。
认为可以通过将响应流传递给CreateSafeNavigator来修复它,但是也许读取响应流也可以从异步操作中受益。
https://stackoverflow.com/questions/12322758
复制相似问题