Я читаю Concurrency in C#
Стивена Клири, в котором есть пример, который озадачил меня на некоторое время.
Обычно для метода LINQ Select требуется лямбда-метод, который возвращает значение для коллекции результатов.
В книге на стр. 30 есть пример, где лямбда-выражение ничего не возвращает, нотем не менее, код компилируется и работает нормально:
static async Task<int> DelayAndReturnAsync(int val)
{
await Task.Delay(TimeSpan.FromSeconds(val));
return val;
}
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);
// Note: nothing is returned
}).ToArray();
// Await all processing to complete
await Task.WhenAll(processingTasks);
}
// Outputs:
// 1
// 2
// 3
Вопрос об этой части:
var processingTasks = tasks.Select(async t =>
{
var result = await t;
Trace.WriteLine(result);
// Note: nothing is returned
}).ToArray();
Почему это так?Это рекомендуемый подход?
ОБНОВЛЕНИЕ:
Где это поведение документировано?