C# 异步TaskCompletionSource调用方法两次

C# 异步TaskCompletionSource调用方法两次,c#,async-await,c#-5.0,C#,Async Await,C# 5.0,使用wait调用带有回调的异步方法之后,我在Argotic RSS阅读器库中使用了它: var tcs = new TaskCompletionSource<string>(); EventHandler<SyndicationResourceLoadedEventArgs> feedReaderOnLoaded = null; feedReaderOnLoaded = (sender, args) => {

使用
wait
调用带有回调的异步方法之后,我在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;
var tcs=new TaskCompletionSource();
EventHandler feedReaderOnLoaded=null;
feedReaderOnLoaded=(发送方,参数)=>
{
feedReader.Loaded-=feedReaderOnLoaded;
SetResult(“”;//需要等待才能完成
};
feedReader.Loaded+=feedReaderOnLoaded;
LoadAsync(新Uri(feed.Url),新对象());
等待tcs任务;
//结果放在属性中,而不是从方法返回
变量项=feedReader.Channel.items;
这样做很好,我得到了我的物品

我在Fiddler中注意到有两个调用正在对RSS提要的url进行调用。在调试器中单步执行代码时,它在
LoadAsync
上被调用一次,在
wait tcs.Task
上再次被调用。我应该如何消除其中一个呼叫

更新有一个控制台应用程序项目可以演示这种行为


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

看起来它是异步API中的一个错误/功能

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

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


我认为可以通过将响应流传递到
CreateSafeNavigator
来解决这个问题,但是读取响应流也可能从异步执行中受益。

如果您根本不使用调试器,您是否看到了同样的效果?如果您根本不使用异步,您是否也看到了同样的效果?例如,读者是否可能只是自然地发出两个调用(例如,一个HEAD然后一个GET)?是的,效果相同,而且它们都是GET。我将恢复到同步版本并再次发表评论。我觉得没问题。你能把它放到一个简短但完整的控制台应用程序中吗?我回家后可以试试?看起来我很喜欢深入挖掘,一旦我复制了它…我怀疑在Argotic RSS中有问题。如果在没有TCS的情况下使用
LoadAsync
/
Loaded
,您会看到多少请求?