Почти каждый SO ответ на этот вопрос гласит, что:
Также:
Я рекомендую вам не думать об этом как о "использовании async в LINQ"
Но в книге Стивена есть образец для:
Проблема: У вас есть набор задач, которые ждут, и вы хотите сделать некоторые обрабатывать каждую задачу после ее завершения. Однако вы хотите сделать обработка для каждого, как только он завершается, не, ожидая любая из других задач.
Одно из рекомендуемых решений:
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);
}
Вопрос №1:
Я не понимаю, почему теперь async
внутри оператора LINQ - работает. Разве мы не сказали "не думайте об использовании async
в LINQ"?
Вопрос № 2:
Когда элемент управления достигает await t
здесь - что на самом деле происходит? Оставляет ли элемент метод ProcessTasksAsync
? или он оставляет анонимный метод и продолжает итерацию?