Ответ 1
Для нормальной остановки служб Windows вы должны поместить свой код в свой метод Stop.
http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.stop.aspx
В целом, грубые прерывания потока и грубые выгрузки домена приложения не будут запускать "нормальные" финализаторы - вы можете получить более подробную информацию в этой статье MSDN.
До этого момента я просто говорил о прерываниях потока в результате выполнения потока ThreadAbortException в потоке. Как правило, это приведет к прекращению потока. Тем не менее, поток может обрабатывать прерывание потока, предотвращая его завершение потока. Чтобы учесть это, среда выполнения обеспечивает более мощное действие, метко названное "грубый поток" прерывается. Отказ от грубой нити приводит к прекращению выполнения потока. Когда это происходит, CLR не гарантирует, что будет выполняться какой-либо код возврата в потоке (если только код не выполняется в CER). Грубо, действительно.
Аналогично, в то время как типичная разгрузка домена приложения будет изящно прервать все потоки в домене, грубая выгрузка домена приложения будет грубо прервать все потоки в домене и не гарантирует, что обычные финализаторы, связанные с объектами в этом домене, будут работать. SQL Server 2005 - это один CLR-хост, который использует грубые прерывания потока и грубый отладки домена приложения как часть своей политики эскалации. Когда возникает асинхронное исключение, отказ в распределении ресурсов будет обновлен до прерывания потока. И когда происходит прерывание потока, если оно не завершится в течение временного интервала, установленного SQL Server, оно будет обновлено до отказа грубой нити. Аналогичным образом, если операция разгрузки домена приложения не заканчивается в течение времени, установленного SQL Server, она будет обновлена до грубой разгрузки домена приложения. (Обратите внимание, что только что выложенные политики не совсем то, что использует SQL Server, так как SQL Server также учитывает, выполняется ли код в критических областях, но больше на эту тему).