¿Los bloques de iteradores regulares (es decir, "rendimiento de retorno") son incompatibles con "async" y "await"?
Esto da una buena idea de lo que estoy tratando de hacer:
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;
}
Sin embargo, obtengo un error del compilador que menciona "no se puede cargar la cadena de mensajes desde los recursos".
Aquí hay otro intento:
async Task<IEnumerable<Foo>> Method(String [] Strs)
{
foreach(var str in strs)
{
yield return await DoSomethingAsync( str)
}
}
Pero nuevamente, el compilador devuelve un error: "no se puede cargar la cadena de mensajes desde los recursos".
Aquí está el código de programación real en mi proyecto.
Esto es muy útil cuando tengo una tarea de lista, esa tarea se puede descargar HTML desde una URL y uso la sintaxis "rendimiento, retorno, espera de tarea", el resultado es que quiero IEnumerable<Foo>
. No quiero escribir este código:
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;
}
Pero parece que tengo que hacerlo.
Gracias por cualquier ayuda.
IAsyncEnumerator<T>
tipo definido por Arne.