2012-09-07 2 views
4
콜백와 비동기 메서드를 호출 await를 사용 found this way를 갖는

, 나는 Argotic RSS 리더 라이브러리를 사용했습니다 :비동기 TaskCompletionSource 호출하는 방법은 두 번

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; 

그래서 잘 작동, 내가 얻을 내 항목.

피들러에서 RSS 피드의 URL에 두 건의 호출이 있음을 알았습니다. 디버거에서 코드를 단계별로 실행하면 LoadAsync에서 한 번 호출되고 await tcs.Task에서 다시 호출됩니다. 통화 중 하나를 제거하려면 어떻게해야합니까?

업데이트downloaded from here이 동작을 설명하는 콘솔 앱 프로젝트가 있습니다.

UPDATE 나는 내가 Argotic 라이브러리를 사용하는 방법 내가 HttpClient를 사용하여 RSS 피드를 다운로드 할 수 있도록 변경하고 이제 하나의 호출을 생성하는 문자열로 Argotic에 내용을 전달했습니다. 누구에게 아이디어가 있다면 왜 두 번 부름을 받았는지 아직도 알고 싶습니다.

+0

* 디버거를 전혀 사용하지 않으면 같은 효과가 나타 납니까? –

+2

그리고 비동기를 전혀 사용하지 않는다면? 예를 들어 독자가 단순히 두 번 전화를 자연스럽게 (예 : HEAD, GET) 호출 할 수 있습니까? –

+0

예, 동일한 효과가 있으며 둘 다 GET입니다. 동기화 버전으로 되돌아 가서 다시 댓글을 달아 드리겠습니다. – harriyott

답변

1

마치 비동기 API 인 feed reader의 버그/기능처럼 보입니다.

비동기 WebRequest를 수행하여 피드를 가져옵니다. 그러나 WebRequest 완성을 처리하면 응답을위한 XmlReader가 만들어 지지만 실제로는 소스 URL에서 (동 기적으로) 읽는 SyndicationEncodingUtility.CreateSafeNavigator(Url, new WebRequestOptions(), null) 이 사용됩니다.

피드 자체가 두 번째로 캐시되므로 엄청난 오버 헤드가 발생하지 않습니다.

응답 스트림을 CreateSafeNavigator으로 전달하여 해결할 수 있다고 생각하지만 응답 스트림을 읽는 것은 비동기 적으로 수행 될 수도 있습니다.