Jak mogę czekać, aż Parallel.ForEach się zakończy

123

Używam TPL w moim bieżącym projekcie i używam Parallel.Foreach do przędzenia wielu wątków. Klasa Task zawiera Wait (), aby poczekać, aż zadanie zostanie ukończone. W ten sposób, jak mogę czekać, aż Parallel.ForEach zakończy się, a następnie przejść do wykonywania kolejnych instrukcji?

VJAI
źródło

Odpowiedzi:

193

Nie musisz robić nic specjalnego, Parallel.Foreach()poczekasz, aż wszystkie rozgałęzione zadania zostaną ukończone. Z wątku wywołującego można traktować ją jako pojedynczą instrukcję synchroniczną i na przykład zawinąć ją w try / catch.

Henk Holterman
źródło
10
„Parallel.Foreach () będzie czekać, aż wszystkie jej rozgałęzione zadania zostaną zakończone”, może to być mylące w niektórych sytuacjach, na przykład (zadanie asynchroniczne w środku): Parallel.ForEach (groupedUnreadMessages, async unreadMsgCollection => {/ * działa * /});
Bo HU
oto inne problemy w stackoverflow: stackoverflow.com/questions/11564506/ ...
Bo HU
4
Ta odpowiedź pochodzi z 2011 roku, zanim async / await. Ale jak powiedziałem, tworzenie wątków wewnątrz ForEach nie jest dobrym pomysłem. Ani też nie jest akcją asynchroniczną. Opublikowane przez Ciebie linki zawierają dobre informacje i rozwiązania.
Henk Holterman
1
„tworzenie wątków wewnątrz ForEach nie jest dobrym pomysłem”, czy możesz rozwinąć? Czy to „chyba, że ​​zaczekasz przed powrotem”?
Gianthra
16

Nie potrzebujesz tego z Parallel.Foreach: wykonuje foreach tylko w tylu wątkach, ile jest dostępnych procesorów, ale zwraca synchronicznie.

Więcej informacji można znaleźć tutaj

Louis Kottmann
źródło