Когда процесс завершается, ОС восстанавливает всю выделенную память и закрывает все открытые дескрипторы.Вам не нужно беспокоиться о ПАМЯТИ *), которая просачивается в особый случай закрытия приложения.ОС также закроет все ваши открытые дескрипторы **), по крайней мере, теоретически.Учитывая все это, для вас может быть безопасным просто прекратить поток (используя TerminateThread (MyThread.Handle) ) из деструктора форм, прежде чем убивать другие общие ресурсы.Задайте себе эти вопросы:
- Что нить делает?Безопасно ли прекратить его в любое время?Пример: если поток выполняет какую-либо запись на диск, просто небезопасно его уничтожать, поскольку вы можете хранить файлы на диске в несогласованном состоянии.
- Используете ли вы какие-либо ресурсы, которые не освобождаются автоматически Windows?Не могу придумать хорошего примера здесь ...
Если вы оба в безопасности, вы можете использовать TerminateThread и не ждать естественного завершения потока.Более безопасный подход может быть комбинированным, возможно, вам следует дать потоку возможность естественного завершения и, если он не завершился в течение 5 секунд, принудительно завершить его.
*) Я говорю о памятивы можете доказать только утечки при завершении процесса, например, потоки, которые вы убиваете, не давая им возможности правильно завершить работу, или глобальные одноэлементные классы, которые вы не освобождаете.Вся остальная неучтенная память должна быть отслежена и исправлена, потому что это ошибка.
**) К сожалению, операционная система Windows не без ошибок.Пример. Любой, кто работал с последовательными устройствами на платформе Windows, знает, как легко перевести последовательное устройство в «заблокированное» состояние, требуя перезагрузки, чтобы оно снова заработало.Технически это также дескриптор, завершающий обработку приложения, которое заблокировало его, должно разблокировать его.