일반 반복자 블록 (예 : "yield return")이 "async"및 "await"와 호환되지 않습니까?
이것은 내가하려는 일에 대한 좋은 아이디어를 제공합니다.
async Task<IEnumerable<Foo>> Method(String [] Strs)
{
// I want to compose the single result to the final result, so I use the SelectMany
var finalResult = UrlStrings.SelectMany(link => //i have an Urlstring Collection
await UrlString.DownLoadHtmlAsync() //download single result; DownLoadHtmlAsync method will Download the url's html code
);
return finalResult;
}
그러나 "자원에서 메시지 문자열을로드 할 수 없습니다"라는 컴파일러 오류가 발생합니다.
다음은 또 다른 시도입니다.
async Task<IEnumerable<Foo>> Method(String [] Strs)
{
foreach(var str in strs)
{
yield return await DoSomethingAsync( str)
}
}
그러나 컴파일러는 "자원에서 메시지 문자열을로드 할 수 없습니다"라는 오류를 반환합니다.
내 프로젝트의 실제 프로그래밍 코드는 다음과 같습니다.
이것은 목록 작업이있을 때 매우 유용합니다. 해당 작업은 URL에서 HTML을 다운로드 할 수 있으며 "yield return await task"구문을 사용합니다 IEnumerable<Foo>
. 결과는 I want 입니다. 이 코드를 작성하고 싶지 않습니다.
async Task<IEnumerable<String>> DownLoadAllURL(String [] Strs)
{
List<Foo> htmls= new ...
foreach(var str in strs)
{
var html= await DownLoadHtmlAsync( str)
htmls.Add(item)
}
return htmls;
}
하지만해야 할 것 같습니다.
도움을 주셔서 감사합니다.
IAsyncEnumerator<T>
Arne이 정의한 유형을 사용합니다 .