手动计时C#螺纹
我需要为长时间运行的线程添加超时。我们遇到了一些外部问题,这些问题有时会导致线程无限期地挂起在某一行代码上。为了使我们的进程更加健壮,我们希望检测线程不再主动运行/轮询,并中止线程。这将允许我们清理资源并重新启动线程手动计时C#螺纹,c#,multithreading,timeout,C#,Multithreading,Timeout,我需要为长时间运行的线程添加超时。我们遇到了一些外部问题,这些问题有时会导致线程无限期地挂起在某一行代码上。为了使我们的进程更加健壮,我们希望检测线程不再主动运行/轮询,并中止线程。这将允许我们清理资源并重新启动线程 //suspect thread foreach(var thing in whatever) { //do some stuff SomeClass.StaticVariable = DateTime.Now; } //monitor thread while(
//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()
}
添加此功能的首选方法是什么?您需要两件事:
//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()
}
//可疑线程
foreach(任何事物的变量)
{
//做点什么
SomeClass.StaticVariable=DateTime.Now;
}
//监视线程
当(应该仍在工作)
{
睡眠(时间跨度从分钟(10));
if(DateTime.Now.Subtract(TimeSpan.FromMinutes(15)
首选方法是在自己的进程中运行不可靠的子系统,而不是在自己的线程中。这样,当它表现不好时,您可以破坏整个进程,并让操作系统清理掉它留下的任何可怕的混乱。杀死在您的进程中运行不可靠代码的线程可能会有各种令人讨厌的副作用对代码的影响,因为操作系统无法知道哪些资源属于行为不良的线程,哪些资源仍在使用
长话短说:不要与无法控制的代码共享进程。在主应用程序中启动计时器,在超时时间过后中止工作线程。使用工作线程的回调方法重置计时器。这对我来说不太可行,因为我需要从此进程返回结果(它是IBM MQSeries客户端)。因此,这将使这个单独的过程难以将数据返回到我的应用程序。@Joel:然后你必须决定你喜欢什么:健壮而笨拙,还是脆弱而简单。设计当然是一种妥协的艺术,最能服务于你的客户和利益相关者;你的客户和利益相关者是否高度重视产品的健壮性r或低于编写产品的易用性?+1用于单独的进程,尽管我的回答是这样的。@Joel,为什么不让最后一次轮询将结果传达给您的监视进程(在结束进程之前)?对于进程间通信,我假设您使用的是XML-RPC或其他东西。将可疑进程设为“从进程”。这与我想解决问题的方式一致。很高兴看到其他人验证了它。虽然我可以感谢Eric的回答,但它根本不适合我的特定应用。谢谢大家!