Quasi la risposta di ogni tanto su questo argomento, afferma che:async all'interno di un codice LINQ - Chiarimento?
anche:
I recommend that you not think of this as "using async within LINQ"
Ma nel libro di Stephen v'è un campione per :
Problema: Hai una raccolta di attività per aspettare, e si vuole fare un po ' lavorazione su ogni attività dopo aver completato. Tuttavia, si desidera eseguire l'elaborazione per ciascuna non appena completata, non in attesa di una qualsiasi delle altre attività.
Una delle soluzioni consigliate era:
static async Task<int> DelayAndReturnAsync(int val)
{
await Task.Delay(TimeSpan.FromSeconds(val));
return val;
}
// This method now prints "1", "2", and "3".
static async Task ProcessTasksAsync()
{
// Create a sequence of tasks.
Task<int> taskA = DelayAndReturnAsync(2);
Task<int> taskB = DelayAndReturnAsync(3);
Task<int> taskC = DelayAndReturnAsync(1);
var tasks = new[] { taskA, taskB, taskC };
var processingTasks = tasks.Select(async t =>
{
var result = await t;
Trace.WriteLine(result);
}).ToArray();
// Await all processing to complete
await Task.WhenAll(processingTasks);
}
Domanda # 1:
non capisco perché adesso async
all'interno di una dichiarazione LINQ - funziona. Non abbiamo semplicemente detto "non pensare di utilizzare async
all'interno di LINQ"?
Domanda # 2:
Quando il controllo raggiunge il await t
qui - Che cosa è realmente accadere? Il controllo lascia il metodo ProcessTasksAsync
? o lascia il metodo anonimo e continua l'iterazione?
Quel "don "Penso a ..." non era un imperativo. Nessuno dei testi che hai citato dice che async non funzionerà con Linq - solo che non è una corrispondenza perfetta. –
Una buona lettura di Stephen Toub, se non l'hai ancora incontrato: [Task, Monads e LINQ] (http://blogs.msdn.com/b/pfxteam/archive/2013/04/03/tasks -monads-e-linq.aspx). – Noseratio