【发布时间】:2011-01-12 07:49:06
【问题描述】:
我需要为长时间运行的线程添加超时。我们遇到了一些外部问题,这些问题有时会导致该线程无限期地挂在某行代码上。为了使我们的进程更加健壮,我们想检测线程不再主动运行/轮询并中止线程。这将让我们清理资源并重新启动线程。
添加此功能的首选方法是什么?
【问题讨论】:
标签: c# multithreading timeout
我需要为长时间运行的线程添加超时。我们遇到了一些外部问题,这些问题有时会导致该线程无限期地挂在某行代码上。为了使我们的进程更加健壮,我们想检测线程不再主动运行/轮询并中止线程。这将让我们清理资源并重新启动线程。
添加此功能的首选方法是什么?
【问题讨论】:
标签: c# multithreading timeout
首选方法是在它自己的进程中运行不可靠的子系统,而不是在它自己的线程中运行。这样,当它表现不佳时,您可以破坏整个过程并让操作系统清理它留下的任何可怕的混乱。杀死在你的进程中运行不可靠代码的线程会对你的代码产生各种讨厌的副作用,因为操作系统无法知道哪些资源属于行为不端的线程以及你仍在使用哪些资源。
长话短说:不要与无法控制的代码共享进程。
【讨论】:
你需要两件事:
在最简单的版本中,您的可疑线程以可靠的频率使用当前时间更新共享静态变量。如何适应你的线程的控制流取决于你(这是困难的部分——你通常会用另一个线程来做那种事情)。然后只需唤醒第二个线程并经常检查它。如果不是最近的时间,请中止线程。
//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()
}
【讨论】:
在您的主应用程序中启动一个计时器,在您的超时时间过去后中止工作线程。使用工作线程中的回调方法来重置计时器。
【讨论】: