2010-02-02 87 views
2

我有一个需要添加一个超长时间运行的线程。我们遇到了一些外部问题,有时会导致该线程无限期地挂在特定的代码行上。为了使我们的过程更健壮,我们希望检测到线程不再主动运行/轮询并中止线程。这将让我们清理资源并重新启动线程。手动计时一个C#线程

添加此功能的首选方法是?

回答

2

你需要两样东西:

  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() 
} 
+0

这符合我想要解决问题的方式。很高兴看到它由其他人验证。虽然我可以欣赏Eric的回应,但它并不适合我的具体应用。多谢你们! – 2010-02-05 15:45:41

6

的优选方法是在它自己的过程运行不可靠的子系统,而不是它自己的线程。这样,当它表现糟糕时,你可以摧毁整个过程,并让操作系统清理它留下的任何可怕的混乱。在进程中杀死一个运行不可靠代码的线程可能会对代码产生各种令人讨厌的副作用,因为操作系统无法知道哪些资源属于不良行为线程以及哪些资源仍在使用。

长话短说:不会与您无法控制的代码共享进程。

+0

这对我来说并不是真的可行,因为我需要从此进程中返回结果(它是IBM MQSeries客户端)。所以这会让这个单独的过程难以将数据回传给我的应用程序。 – 2010-02-02 21:14:30

+0

@Joel:那么你必须决定你喜欢什么:健壮和笨重,或脆弱和容易。设计当然是为您的客户和利益相关者提供最佳服务的艺术。您的客户和利益相关者是否认为产品的耐用性高于或低于产品的易用性?尽管我的答案是 – 2010-02-02 21:30:39

+0

单独的进程。 @Joel,你为什么不直接把最后一次调查的结果告诉你的监测过程(在结束过程之前)?对于进程间通信,我假设你会使用XML-RPC或其他东西。让嫌疑人处理“奴隶”。 – 2010-02-03 22:24:16

0

在您的主应用程序中启动一个定时器,用于在超时时间结束后中止工作线程。使用工作线程中的回调方法重置计时器。