我想从另一个线程监视一个线程。当前正在查看 thread.isalive 属性。如果线程中有任何异常,thread.isalive 属性仍然为 true。
如果线程中有任何异常或者线程处于无限循环中,我想杀死线程。
感谢您的意见/解决方案/建议。
Raju
听起来受监视的线程正在捕获它抛出的异常,否则,它会终止并可能也会导致整个进程停止运行。您可以订阅AppDomain.FirstChanceException http://msdn.microsoft.com/en-us/library/dd997368.aspx事件来确定最初抛出异常的时间,但即使发生这种情况,您也不一定要终止线程(如果线程捕获异常、处理异常并正常继续执行怎么办?)。相反,请考虑让异常“正常”终止线程,然后在监视器代码中捕获它以防止它停止进程。
无法判断线程是否处于无限循环中,但您可以终止运行时间过长的线程(请参见下面的示例代码)。强制终止线程Thread.Abort
但是,可能会导致问题并且有代码味道(请参阅here http://msmvps.com/blogs/peterritchie/archive/2007/08/22/thead-abort-is-a-sign-of-a-poorly-designed-program.aspx)。您应该考虑更改工作线程以管理其自身的生命周期。
class Program
{
static void Main(string[] args)
{
if (RunWithTimeout(LongRunningOperation, TimeSpan.FromMilliseconds(3000)))
{
Console.WriteLine("Worker thread finished.");
}
else
{
Console.WriteLine("Worker thread was aborted.");
}
}
static bool RunWithTimeout(ThreadStart threadStart, TimeSpan timeout)
{
Thread workerThread = new Thread(threadStart);
workerThread.Start();
bool finished = workerThread.Join(timeout);
if (!finished)
workerThread.Abort();
return finished;
}
static void LongRunningOperation()
{
Thread.Sleep(5000);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)