sintaxis ordenar expresiones ejemplos diferente consultas consulta comandos buscar linq windows-runtime async-await c#-5.0 winrt-async

expresiones - ordenar en linq



Cómo esperar un método en una consulta de Linq (2)

Tratando de usar la palabra clave LINQ en una consulta LINQ y obtengo esto:

El operador ''en espera'' solo puede usarse en una expresión de consulta dentro de la primera expresión de recopilación de la cláusula ''de'' inicial o dentro de la expresión de recopilación de una cláusula ''unirse''

Código de muestra:

var data = (from id in ids let d = await LoadDataAsync(id) select d);

¿No es posible esperar algo en una consulta LINQ , o necesita estructurarse de otra manera?


Puede definir algunas operaciones de sincronización asíncrona usted mismo (para linq a los objetos): por ejemplo: puede escribir su propio método de extensión WhereAsync:

public static async Task<IEnumerable<T>> WhereAsync<T>( this IEnumerable<T> target, Func<T, Task<bool>> predicateAsync) { var tasks = target.Select(async x => new { Predicate = await predicateAsync(x).ConfigureAwait(false), Value = x }).ToArray(); var results = await Task.WhenAll(tasks).ConfigureAwait(false); return results.Where(x => x.Predicate).Select(x => x.Value); }

Y úsalo así:

var ints = new List<int> { 1, 2, 3 }; var smallInts = await ints.WhereAsync(IsSmallIntAsync);


LINQ tiene soporte muy limitado para async / await . Para LINQ-to-objects, la única operación realmente útil que conozco es hacer una Select con un delegado async (que da como resultado una secuencia de tareas).

List<T> data = new List<T>(); foreach (var id in ids) data.Add(await LoadDataAsync(id));

Si puede hacer LoadDataAsync en paralelo de manera segura, su ejemplo podría reescribirse como:

T[] data = await Task.WhenAll(ids.Select(id => LoadDataAsync(id)));