我需要为长时间运行的线程添加超时。我们遇到了一些外部问题,这些问题有时会导致该线程无限期地挂在某一行代码上。为了使我们的进程更健壮,我们希望检测到线程不再主动运行/轮询并中止线程。这将让我们清理资源并重新启动线程。
添加此功能的首选方法是什么?
答案 0 :(得分:6)
首选方法是在其自己的进程中运行不可靠的子系统,而不是自己的线程。这样,当它表现不佳时,您可以破坏整个过程并让操作系统清理它留下的任何可怕的混乱。杀死在您的进程中运行不可靠代码的线程可能会对您的代码产生各种令人讨厌的副作用,因为操作系统无法知道哪些资源属于不良行为的线程以及您仍在使用哪些资源。
长话短说:不与无法控制的代码共享流程。
答案 1 :(得分:2)
你需要两件事:
在最简单的版本中,您的可疑线程以可靠的频率更新当前时间的共享静态变量。如何适应你的线程的控制流程取决于你(这是困难的部分 - 你通常会做这样的事情,咳咳,另一个线程)。然后只需要唤醒第二个线程并经常检查它。如果不是最近的时间,则中止该线程。
//suspect thread
foreach(var thing in whatever)
{
//do some stuff
SomeClass.StaticVariable = DateTime.Now;
}
//monitor thread
while(shouldStillBeWorking)
{
Thread.Sleep(TimeSpan.FromMinutes(10));
if (DateTime.Now.Subtract(TimeSpan.FromMinutes(15) < SomeClass.StaticVariable)
suspectThread.Abort()
}
答案 2 :(得分:0)
在主应用程序中启动一个计时器,在超时时间结束后中止工作线程。使用工作线程中的回调方法重置计时器。