我想在发生非常糟糕的事情时杀死一个线程。你有什么建议自杀?
答案 0 :(得分:3)
你永远不应该“杀死”一个线程。在您的主程序中,您可以使用Thread.Abort方法中止它,但不建议这样做,并且完全没有必要。
你的线程应该只是一个执行长循环的方法。如果发生“非常糟糕”的事情,只需从此方法返回并且线程将结束。
这对于这样的循环就足够了:
private void MyThreadLoop()
{
try
{
while (someCondition)
{
// do a lengthy operation
}
}
catch (Exception ex)
{
Log.Error("Something bad happened: ", ex);
}
}
public void Start()
{
Thread t = new Thread(MyThreadLoop);
t.Start()
}
另一方面,如果你需要你的主程序来杀死线程(但这不是你命名的“自杀”),那么你应该信号你希望它结束的线程,而不是在不知道后台发生了什么的情况下中止它。
答案 1 :(得分:0)
没有必要完全杀死一个线程,你需要做的就是让它停止当前任务。
答案 2 :(得分:0)
在线程内部,它足以从其函数返回。在线程之外,有方法Thread.Abort()。
答案 3 :(得分:0)
你可以尝试这样的事情。线程一直运行,直到它从“外部”接收到信号然后存在。
private static void Main(string[] args)
{
var shouldExit = new AutoResetEvent(false);
ThreadPool.QueueUserWorkItem(
delegate
{
while (true)
{
Console.WriteLine("Running...");
if (shouldExit.WaitOne(0)) break;
}
Console.WriteLine("Done.");
});
// wait a bit
Thread.Sleep(1000);
shouldExit.Set();
Console.ReadLine();
}