Несколько асинхронных задач - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть два асинхронных механизма, которые не имеют прямого отношения друг к другу (они оба выписывают, хотя) .. и я не хочу ни блокировать эффективность другого ..

Если я помещу одно из заданий в набор задач, подобных этому:

var list = new List<Task>();

foreach (var t in things)
{
    list.Add(My.MethodAsync(t)); // method returns Task
}

await Task.WhenAll(t);

Я знаю, что он не будет блокироваться, и потенциально может работать параллельно ..

Если я хотя бы другой асинхронный метод:

var list = new List<Task>();

foreach (var t in things)
{
    list.Add(My.MethodAsync(t)); // method returns Task
}

foreach (var t in things)
{
    await My.OtherAsync(t)); // method returns Task
}

await Task.WhenAll(t);

Task.WhenAll () должен ждать завершения второго foreach ...

Следовательно, возможно ли что-то подобное / рекомендовать?

var allTasks = new List<Task>();

foreach (var t in things)
{
    allTasks.Add(My.MethodAsync(t)); // method returns Task
    allTasks.Add(My.OtherAsync(t)); // method returns Task
}

await Task.WhenAll(t);

Распечатав это, даже если сами задачи являются независимыми, было бы неплохо, если бы возникла ошибка, если обе не выводят .. хмм

вопрос все еще стоит;)

1 Ответ

0 голосов
/ 08 ноября 2018
var allTasks = new List<Task>();

foreach (var t in things)
{
    allTasks.Add(My.MethodAsync(t); // method returns Task
    allTasks.Add(My.OtherAsync(t); // method returns Task
}

await Task.WhenAll(t).ConfigureAwait(false);

Это будет работать просто отлично. Как было отмечено в комментариях, если ваши методы возвращают Task, который уже был запущен (см. здесь ), то все, что Task.WhenAll сделает, - это асинхронно дождется завершения задач. Эти задачи могут выполняться параллельно, если время их выполнения достаточно велико, и вы можете запустить его до завершения предыдущего. Обратите внимание, что я добавил ConfigureAwait(false) в ваш код. Технически, это на самом деле не меняет того, что делает ваш код, поскольку await выполняется со значением false по умолчанию, но оно проясняет ваши намерения, поэтому я предпочитаю это, когда пишу асинхронные вызовы методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...