2016-12-02 34 views
5

Myślę, że słowa kluczowe async/czekaj tutaj są zbędne.Czy to równoległe połączenie asynchroniczne może być uproszczone?

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

Biorąc pod uwagę szereg metod zadaniowych powrocie, czy istnieje bardziej bezpośredni sposób, aby uruchomić je równolegle i wrócić, kiedy wszyscy są kompletne?

+4

Czytaj na Zadanie. Czy kiedykolwiek – Nkosi

+5

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

+0

Dlaczego mieszasz 'Parallel.Invoke' i' async/await'? Parallel.Invoke i tak uruchomi każde połączenie w osobnym wątku i * blokuje *, czekając na ich zakończenie. Lub możesz przechowywać poszczególne zadania w tablicy i czekać na tablicę –

Odpowiedz

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

ewentualnie dodać .ConfigureAwait(false) do WhenAll(), w zależności od kontekstu.

+0

Lub' Task.WaitAll' jeśli zewnętrzna metoda nie jest ' t obecnie 'async' i/lub nie chcą zmieniać istniejącej semantycznej' Parallel.Invoke', która jest blokowana, a nie asynchroniczna. –

+0

@Damien_The_Unbeliever Tak, tak myślę, jeśli to specyficzne wymaganie; nie ma wystarczająco dużo kontekstu, o którym należy wiedzieć. – sellotape

+0

To działa! [Ten komentarz tutaj] (https://stackoverflow.com/questions/25009437/running-multiple-async-tasks-and-waiting-for-them-all-to-complete#comment65496481_25010220) pomylił mnie, że "' Task.WhenAll 'nie uruchamia zadań dla ciebie. Musisz podać je" na gorąco ", co oznacza, że ​​już się zaczęło.", ale najwyraźniej nie musisz tego robić. – orad