Поток, прервать и ждать - PullRequest
2 голосов
/ 18 апреля 2009

Я прерываю поток (скоро будут потоки), и проблема в том, что мне нужно остановить, пока все потоки не были прерваны.

После выполнения Thread.Abort(); я подумал об использовании Thread.Join() для ожидания полной его отмены. Однако это не работает. Это просто ждет вечно. Как я могу прервать каждый поток и дождаться его завершения, прежде чем продолжить?

Дополнительная информация: Если вам интересно, почему - в этом случае я закрываю окно, я передаю функцию делегата в поток, который он вызывает, когда он сделан (или прерван). Если я не остановлюсь, то окно закроется, и функция вызовет недействительные дескрипторы / объекты. Я могу легко использовать тот же метод, вставить флаг и зациклить и уснуть, пока все флаги не будут установлены, но это не так.

Ответы [ 2 ]

4 голосов
/ 18 апреля 2009

Из многолетнего опыта работы с потоками я узнал, что есть пара правил, которые, если их соблюдать, облегчают жизнь лот .

Один вопрос, относящийся к этому вопросу:

  • позволяют потокам управлять своими собственными ресурсами, включая время жизни.

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

Этот метод часто может быть таким простым, как флаг «запись создателем / чтение за потоком», который управляет основным циклом потоков. Если поток имеет долго выполняющиеся задачи в цикле, вам также следует периодически проверять.

Тогда поток создателя должен просто присоединиться, пока поток не выйдет. Правильно спроектированный, вы можете установить верхний предел времени, которое это займет.

1 голос
/ 18 апреля 2009

Используйте объект синхронизации, такой как Событие. Например, каждый фоновый поток имеет Событие, связанное с ним. Когда поток завершается, он сигнализирует о событии. Основной поток выполняет WaitHandle.WaitAll для набора событий и продолжается только тогда, когда сигнализируются все события.

Имейте в виду, что если существует вероятность того, что фоновые потоки прекратят работу в течение длительного времени, блокировка основного потока во время ожидания приведет к ухудшению работы пользователя. Так что, если это так, вы можете скрыть окно перед блокировкой. Кроме того, вы захотите проверить, как это повлияет на ваш делегат обратного вызова - если поток пользовательского интерфейса заблокирован в ожидании, сможет ли он обработать ваш делегат?

Не лучше ли не вызывать делегат, если поток прерывается из-за закрытия окна? Просто попросите основной поток сообщить фоновым потокам, почему они завершаются, и попросите их пропустить обратный вызов, если причиной является «закрытие окна». (Это предполагает, что вы общаетесь с потоками, как справедливо рекомендует Pax, а не просто вызываете Abort.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...