2009-09-22 3 views
1

Каков стандартный способ ожидания процесса в другом потоке?Стандартный способ ожидания завершения потока

В моем случае у меня есть многопоточная услуга, и я хочу убедиться, что при завершении службы завершение обработки завершается до выхода службы. Должен ли я использовать ManualResetEvent?

+0

Я думаю, вы имеете в виду что-то вроде «Стандартный метод для ожидания завершения потока». Процессы имеют потоки, а не наоборот. –

ответ

2

Если у вас есть ссылка на темы, которые вы ожидаете завершить, вы можете вызвать метод .Join() для этих ссылок. Это приведет к тому, что ваш основной поток будет ждать, пока потоки, которые вы вызвали .Join(), должны закончиться до того, как они начнутся.

В качестве альтернативы вы можете создать массив ManualResetEvents, к которым имеют доступ как основной поток, так и дочерний поток. Каждый дочерний поток имеет ссылку на одно событие в массиве, к которому имеет доступ основной поток. Вызовите WaitHandle.WaitAll (массив событий) в массиве событий в конце основного потока и вызовите .Set() в событии в конце каждого дочернего потока для сигнального потока дочерних потоков основного потока.

Перед основными выходами резьбы, ниже будет блокироваться, пока все дочерние потоки не вызывает .С() на своих мероприятиях:

WaitHandle.WaitAll (массив событий);

+0

Имейте в виду, что WaitAll разрешит до 64 дескрипторов ждать. В обработчике событий остановки службы вам может потребоваться повторить все события и явно вызвать WaitOne на всех дескрипторах –

+0

Фактически комбинированный Thread.Interupt и Thread.Join –

2

Вы можете сохранить список, и когда служба будет остановлена, вызовите Thread.Join на каждом из них по очереди. Это подождало бы, пока все не выйдут.

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