Страницы

Поиск по вопросам

понедельник, 1 апреля 2019 г.

Если нужно ждать завершения Thread, то это лучше делать в финализаторе или в Dispose ?

У меня есть несколько классов которые создают в конструкторе Thread (запуск производится отдельном методе - Start). Необходимо что бы классы не уничтожались до завершения работы потоков (они не фоновые, достаточно быстро отрабатывают, и желательно дождаться их завершения, а не сразу убивать при завершении приложения). В связи с этим вопрос, где выполнять ожидание завершения потока (.Join) - в финализаторе (или деструкторе) или Dispose ?


Ответ

Логика неправильная - Dispose по майкрософтовским гаедлайнам должен выполняться за минимально возможное время. То есть выполнять какое-то ожидание завершения операции нужно в юзерском коде, а не в Dispose и, разумеется, не в финалайзере. Отдельный аргумент против ожидания завершения потока в Dispose - сборщик мусора вполне себе имеет право (и даже разумно делать его таким) быть однопоточным. Соответственно, если вы лепите Wait в Dispose, то на время ожидания завершения потока у вас саспендится сборка мусора, а это очень плохо. Проанализируйте ваш текущий код - наверняка есть способ инвертировать логику вашего приложения, чтобы работающие потоки не доходили до Dispose. Активнее оперируйте TaskPlanner'ами и сервисами ThreadFactory, введите Producer-Consumer. Хороших решений - масса.

Комментариев нет:

Отправить комментарий