2016-12-02 4 views
5

Я думаю, что ключевые слова async/wait здесь избыточны.Можно ли упростить этот параллельный асинхронный вызов?

Parallel.Invoke(
    async() => await DoSomethingAsync(1).ConfigureAwait(false), 
    async() => await DoSomethingAsync(2).ConfigureAwait(false) 
); 

Учитывая ряд задач, возвращающих методов, есть ли более простой способ запустить их параллельно и вернуться, когда все завершилось?

+4

Читайте дальше на Task.WhenAll – Nkosi

+5

'Task.WhenAll (DoSomethingAsync (1), DoSomethingAsync (2))' – Enigmativity

+0

Почему вы смешиваете 'Parallel.Invoke' и' async/await'? Parallel.Invoke будет запускать каждый вызов в отдельном потоке в любом случае и * block * во время ожидания их завершения. Или вы можете сохранить отдельные задачи в массиве и ждать массив –

ответ

4
await Task.WhenAll(DoSomethingAsync(1), DoSomethingAsync(2)); 

При необходимости добавьте .ConfigureAwait(false) к WhenAll(), в зависимости от контекста.

+0

Или 'Task.WaitAll', если внешний метод isn ' t в настоящее время 'async' и/или они не хотят изменять существующую семантику' Parallel.Invoke', которая блокирует, а не async. –

+0

@Damien_The_Unbeliever Да, я так думаю, если это конкретное требование; в вопросе не существует достаточно контекста. – sellotape

+0

Это работает! [Этот комментарий здесь] (https://stackoverflow.com/questions/25009437/running-multiple-async-tasks-and-waiting-for-them-all-to-complete#comment65496481_25010220) путают меня, что «' Task.WhenAll 'не запускает задачи для вас. Вы должны предоставить им« горячую », то есть уже начатую.», но, видимо, вам не нужно это делать. – orad

 Смежные вопросы

  • Нет связанных вопросов^_^