В C# потоки не могут быть остановлены вообще без побочных эффектов. Представьте себе, что в нити есть одноразовые предметы, готовые и - просто останавливается. В качестве обходного пути, когда поток прерывается (что вы - не следует, но вы можете вызвать объект Thread), генерируется и выполняется исключение ThreadAbortException. Это позволяет обработке исключений включать и закрывать дескрипторы файлов и т. Д. c.
Ах, наконец-то нашёл это - это сообщение в блоге, объясняющее, почему ВЫ никогда не должны вызывать Thread.Abort (то есть он не должен вызываться код приложения):
http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation
Речь идет о синхронизации, и поток на самом деле не выполняется окончательно должным образом в действительно плохих случаях.
Теперь, ЧТО-ТО должно выяснить, что вызывает прерывание потока. Это то, что нужно проверить - помогут детали исключения, включая трассировку стека и возможное внутреннее исключение в нем.