Вы должны прервать поток, только если этот поток больше ничего не делает.В других случаях я бы рекомендовал установить какое-то уведомление (например, установить логическое свойство потока), которое заставит ваш поток корректно завершить работу.Сказав, что согласно документации блок finally должен выполняться в .NET 2.0:
Когда вызывается метод Abort для уничтоженияпоток, общеязыковая среда выполнения создает исключение ThreadAbortException.ThreadAbortException - это особое исключение, которое может быть перехвачено, но оно будет автоматически вызвано снова в конце блока catch.Когда возникает это исключение, среда выполнения выполняет все блоки finally перед окончанием потока.
Лучшее предположение относительно того, что происходит, заключается в том, что основной поток завершает работу до того, как блок finally в вашем потоке имеетшанс быть казненным.Попробуйте вставить Thread.Sleep
после прерывания потока, чтобы увидеть, изменит ли это поведение.
Редактировать: я написал простой пример с .NET 2.0, который выдает следующий вывод, показывающий, что блок finally выполняется.
Жив и кайф
Жив и кайф
Жив и кайф
Исключение
Наконец
class ThreadTest
{
public ThreadTest() { }
public void test()
{
try
{
while (true)
{
Console.WriteLine("Alive and kicking");
Thread.Sleep(2000);
}
}
catch (Exception ex)
{
Console.WriteLine("Exception");
}
finally
{
Console.WriteLine("Finally");
}
}
}
class Program
{
static void Main(string[] args)
{
ThreadTest myThreadTest = new ThreadTest();
Thread myThread = new Thread(new ThreadStart(myThreadTest.test));
myThread.Start();
Thread.Sleep(5000);
bool status = myThread.Join(1000);
if (myThread.IsAlive)
{
myThread.Abort();
}
Thread.Sleep(5000);
}
}