Не существует безопасного способа убить поток, не выполнив немного работы: вы никогда не должны вызывать Abort для потока; что вам нужно сделать, это обнаружить в потоке, что требуется завершить работу до завершения его нормального выполнения, а затем вам нужно сообщить ему, как выполнить это завершение.
В C # самый простой способ сделать это - использовать BackgroundWorker , который по сути является объектом, выполняющим код в фоновом потоке; это похоже на вызов invoke, за исключением того, что вы имеете больший контроль над выполнением потока. Вы запускаете работника, вызывая RunWorkerAsync (), и вы приказываете его отменить, вызывая RunWorkerAsync (). После вызова RunWorkerAsync () для свойства CancellationPending фонового работника устанавливается значение true; вы наблюдаете за этим изменением в своем коде (т. е. в цикле while), а когда оно истинно, вы завершаете (т. е. выходите из цикла while)
while (!CancellationPending )
{
// do stuff
}
Лично я делаю все потоки через BackgroundWorkers, потому что они просты для понимания и предлагают простые способы связи между фоном и основными потоками