У вас есть варианты. Если вам не все равно, завершается ли операция, когда приложение идет вниз, вам может быть лучше использовать поток ThreadPool через QueueUserWorkItem или (как подсказывает Servy в комментариях) установите для свойства IsBackground вашего потока значение true, что позволит процессу для выхода без выхода потока.
Если вы заботитесь о завершении операции и/или о логике очистки, которую необходимо запустить при завершении работы, вероятно, вы действительно не хотите использовать Thread.Abort, по крайней мере, не как вашу стратегию goto. То, что я использую что-то похожее на это:
public abstract class DisposableThread : IDisposable
{
private ManualResetEvent exiting = new ManualResetEvent(false);
private Thread theThread;
private TimeSpan abortTimeout;
public DisposableThread():
this(TimeSpan.FromMilliseconds(100))
{
}
public DisposableThread(TimeSpan abortTimeout)
{
this.abortTimeout = abortTimeout;
theThread = new Thread((_) => ThreadProc());
}
protected virtual void ThreadProc()
{
while(!exiting.WaitOne(0))
{
WorkUnit(exiting);
}
ThreadCleanup();
}
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
exiting.Set();
if (!theThread.Join(abortTimeout))
{
// logme -- the thread didn't shutdown gracefully
theThread.Abort();
while (!theThread.Join(1000))
{
// logme -- the thread is doing something dumb in an exception handler
}
}
exiting.Dispose();
}
// WorkUnit should return as quickly as safe if the exiting handle is set
// If it doesn't the thread will be aborted if it takes longer than abortTimeout
protected abstract void WorkUnit(WaitHandle exiting);
// override if you need to cleanup on exit
protected virtual void ThreadCleanup() { }
}
Что дает ваш поток шанс выйти грациозно и прерывает только если изящный выход из строя.
Если вы не хотите, чтобы поток блокировался навсегда, не указывайте его. Это действительно настолько просто. Каждый раз, когда вы чувствуете, что вам нужно проникнуть извне и заставить поток что-то сделать, это просто доказывает, что вы не кодировали нить, чтобы делать то, что вам действительно нужно в первую очередь. –