Метод WhenAny
Task.WhenAny возвращает задачу,
которая завершится вместе с первой
готовой из списка. await даёт
победителя - ту же ссылку, что и один
из аргументов. Все сразу -
WhenAll.
Синтаксис
Task<Task> race = Task.WhenAny(task1, task2);
Task<Task<T>> race = Task.WhenAny(t1, t2);
Пример
Давайте сравним готовую задачу и незавершённую:
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var pending = new TaskCompletionSource<string>();
var ready = Task.FromResult("abcde");
Task<string> winner = await Task.WhenAny(
ready, pending.Task);
string res = await winner;
Console.WriteLine(res);
}
}
Результат выполнения кода:
"abcde"
Пример
Давайте проверим, что победитель - та же задача:
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var pending = new TaskCompletionSource<int>();
var ready = Task.FromResult(12345);
Task<int> winner = await Task.WhenAny(
ready, pending.Task);
bool res = ReferenceEquals(winner, ready);
Console.WriteLine(res);
}
}
Результат выполнения кода:
True
Пример
Давайте заберём число у первой готовой:
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var pending = new TaskCompletionSource<int>();
Task<int> winner = await Task.WhenAny(
Task.FromResult(12345), pending.Task);
int res = await winner;
Console.WriteLine(res);
}
}
Результат выполнения кода:
12345
Смотрите также
-
метод
WhenAll,
ждать все задачи -
метод
WhenEach,
обход по мере готовности -
метод
FromResult,
мгновенно готовая задача -
Task,
класс, где объявленWhenAny