我再次想谈谈Thread.Abort
函数的安全性。我有兴趣有一些方法可以放弃我实际上无法控制的操作,但我希望尽快释放线程以防止线程对我的应用程序感到厌烦。.NET Thread.Abort再次
所以我写了一些测试代码,看看是否有可能使用Thread.Abort
并让异常中止的线程清理资源。这里是代码:
int threadRunCount = 0;
int threadAbortCount = 0;
int threadFinallyCount = 0;
int iterations = 0;
while(true)
{
Thread t = new Thread(() =>
{
threadRunCount++;
try
{
Thread.Sleep(Random.Next(45, 55));
}
catch(ThreadAbortException)
{
threadAbortCount++;
}
finally
{
threadFinallyCount++;
}
});
t.Start();
Thread.Sleep(45);
t.Abort();
iterations++;
}
所以,到目前为止,这个代码工作约5分钟,并threadRunCount
总是等于threadFinally
和threadAbort
在数量上有所回落,因为一些线程完成,没有中止或很可能在最后得到了中止。
所以问题是,我想念什么?
我试图运行代码,您提到了文件打开,并且是在创建新线程之后的某个时间点文件仍然忙于另一个应该被中止的线程,但是如果线程不使用共享资源呢? 似乎它只是证明线程Abort有点不安全。 即使我只是需要终止应用程序无法中止导致处理挂起或一些内存泄漏,如果一些非托管代码正在运行? 在我的情况下,我需要的东西可以限制进程运行时间到确切的超时限制,在我的情况下,我无法控制此进程的执行。对此案件的任何想法? – hoodoos 2010-01-18 11:20:37
您应该在SO上提出一个不同的问题,如何限制执行时间,然后在该代码中发布您打算执行的操作。在某些情况下,例如,如果代码在非托管代码中处于忙碌状态,则无法做到您想要的操作。唯一的“安全”方法是产生一个在超时过后完全终止的子进程。 – 2010-01-18 11:24:47
小修正(即使这个答案已经过了一年) 线程不会在catch和finally块内部放弃。所以假设一个写得很好的finally块或者使用块,上面的例子并不是真正的问题。 – Steve 2011-05-16 04:58:58