Как запустить несколько задач и вернуть результат, если первая задача вернула true - PullRequest
0 голосов
/ 17 ноября 2018

Как написать метод, который запускает некоторые задачи асинхронно, проверяет результаты заданных задач, и как только задача возвращает true, метод должен прекратить выполнение и вернуть результат.

Допустим, мы получили этоfunction:

private static async Task<bool> DummyFunction()
{
    Random rand = new Random(DateTime.Now.Millisecond);
    Thread.Sleep(rand.Next(1000, 10000));
    return await Task.FromResult(rand.Next(100) % 2 == 0);
}

И следующий вызовет DummyFunction

private async Task<bool> RunDummy()
{
    List<Task<bool>> tasks = new List<Task<bool>> { DummyFunction(), DummyFunction(), DummyFunction() };
    while (tasks.Any())
    {
        Task<bool> currentTask = await Task.WhenAny(tasks);
        if (await currentTask)
        {
            // do something ..., raise an event, call another method or whatever
            // or simply just return
            return true;
        }
        tasks.Remove(currentTask);
    }
    return false;
}

Я нашел здесь код RunDummy где-то в stackoverflow.но это скорее работает синхронно.Я попытался отладить его и заметил, что он ожидает завершения каждой задачи, прежде чем приступить к следующей.

У меня вопрос: как запустить все задачи параллельно и прекратить выполнение при самом первом методе, который возвращаетtrue

1 Ответ

0 голосов
/ 17 ноября 2018

Используйте Task.WhenAny.Ваша проблема не в RunDummy.

Причина, по которой RunDummy ожидает завершения всех задач, заключается в том, что DummyFunction на самом деле не является асинхронным.Строка Thread.Sleep(rand.Next(1000, 10000)); фактически приостанавливает поток.См. Thread.Sleep документацию - «Приостановляет текущий поток на указанное количество миллисекунд».

Чтобы сделать DummyFunction асинхронным, используйте await Task.Delay(1000).

Oneеще вещь - линия await Task.FromResult(rand.Next(100) % 2 == 0) тоже не асинхронная.Task.FromResult создает готовый Task, а ожидание завершенного задания возвращает значение синхронно.

...