【发布时间】:2012-06-01 12:29:29
【问题描述】:
这不是终止系统进程,而是杀死“我自己”。我有几个并行的线程,由于不同的原因,它们可能会挂起。
当线程耗时过长时,我已经创建了一个看门狗:
TimerCallback timerDelegate = new TimerCallback(CheckProcessStatus);
System.Threading.Timer watchDogTimer = new Timer(timerDelegate, new ProcessHealth(plog), 1000 * 60, 1000 * 60);
try
{
// lots of code here
} finally
{
watchDogTimer.Dispose();
}
看门狗:
public void CheckProcessStatus(Object timerState) {
ProcessHealth ph = (ProcessHealth)timerState;
System.writeLine(string.Format("process runs for {0} minutes!", ph.WaitingTime);
if (ph.WaitingTime>60) {
// KILL THE PROCESS
}
}
当“这里有很多代码”花费太长时间时,我想终止线程,无论它处于什么状态。(在“终止进程”处)。
最好的方法是什么?
Thread.CurrentThread.Interrupt()
或
Thread.CurrentThread.Abort()?
或者有更好的方法吗? (我不能使用像布尔“停止”变量这样的“简单”机制,因为“这里有很多代码”非常动态地通过反射等调用其他类。
这还有效吗?还是我只是杀死看门狗线程,而不是要监视的线程?
【问题讨论】:
-
抛出异常?你的 threadFunc 的“goto”结束似乎比残酷地杀死线程更好。
-
半相关:stackoverflow.com/q/10827930/15541(估计可以多线程调整)
-
Environment.FailFast() 是结束痛苦的一种非常有效的方法。做任何诸如中止线程之类的事情只会在你已经得到的错误之上堆积更多的错误。
-
volatile bool 方法不适合(就像我在上一段中写的那样)
标签: c# multithreading