może utworzyć zdarzenia (np ManualResetEvent
) w każdej z nici, i utrzymywać je w sposób zsynchronizowany listy (stosując lock
konstrukcję). Ustaw zdarzenie lub usuń je z listy po zakończeniu zadania.
Jeśli chcesz dołączyć, możesz użyć WaitHandle.WaitAll
(MSDN documentation), aby poczekać, aż wszystkie zdarzenia zostaną zasygnalizowane.
To jest hack, ale nie widzę sposobu, aby zmniejszyć go do czegoś prostszego!
Edytuj: dodatkowo możesz upewnić się, że żadne nowe wydarzenia nie zostaną opublikowane, a następnie odczekać kilka sekund. Jeśli rzeczywiście są krótkotrwałe, nie będziesz miał problemu. Jeszcze prostsze, ale bardziej odrażające.
Wreszcie, jeśli jest to tylko krótki okres czasu, usługa nie zakończy pracy, dopóki wszystkie wątki nie zginą (chyba że są wątkami tła); więc jeśli jest to krótki okres czasu, menedżer kontroli serwisowej nie będzie miał nic przeciwko drugiej osobie - możesz po prostu zostawić je na wygaśnięcie - z mojego doświadczenia.
Powinny być krótkotrwałe, ale dla mojego przypadku użycia, potrzebuję więcej pewności niż "powinien działać". Zastanawiam się nad użyciem licznika wątków z blokadą do śledzenia liczby wątków w puli i czekania na to zero. – recursive
Właściwie to lubię twoją pierwszą sugestię lepiej niż licznik. – recursive