2010-09-09 105 views
0

我有一个Windows服务,当它启动时会产生大约60个线程。我使用Nagios进行常规监视,并且我有所有必要的例程将数据发送到Nagios。但是,我无法弄清楚如何获得所有线程的总和,并确保它们都不会死机。在Windows服务中监视线程

基本上就是我想要做的是:

foreach(thread t in threadPool) 
{ 
    if(t.isAlive()) 
    { 
     PingHost(t.ThreadID); 
    } 
} 

它似乎并不像这应该是非常困难的,但我不知道从哪里开始。

+0

你可以添加代码到每个线程,将定期调用脉冲或以其他方式通知它仍然活着吗? – 2010-09-09 17:52:22

回答

1

我建议将每个线程添加到以ManagedThreadId为关键字的Dictionary<int, Thread>。然后将回调方法传递给每个线程,并在终止时返回其ManagedThreadId。回调然后从字典中移除线程并通知Nagios。

您可以使用线程的Name属性获取基本的描述性数据,也可以创建自定义对象以保存关于该流程的其他信息并将其存储在字典中而不是线程中。

+0

这听起来不错。我刚刚创建了一个对象来存储有关线程正在处理的进程的信息。我会尝试一下字典的想法。 – 2010-09-09 18:17:20

+0

对于每个新线程,我将创建一个对象,其中包含我需要的所有信息,包括ManagedThreadID。是否有可能基于ManagedThreadID调用thread.IsAlive? – 2010-09-09 18:54:35

+0

IsAlive是线程对象的属性。相反,将线程包含在您的信息对象中。 – 2010-09-09 19:20:18

1

只是一个评论,60是一个固定数量的很多线程。您可能需要考虑一个处理循环(即使它有自己的专用线程) - 调试更容易,可扩展性更强。

但是,如果你真的需要这个,一个选择是...当线程启动时,做一些共享计数器的互锁增量。在线程完成其工作之前,执行一次互锁递减。

+0

不幸的是,我继承了这个项目,并坚持使用线程。但我需要更多的信息,而不仅仅是线程的数量来确定发生了什么。我需要将线程ID与线程正在工作的特定进程相关联,然后在线程关闭时通知nagios。 – 2010-09-09 17:46:31

+0

是的,一个有60个线程的项目往往会经常被继承。这真的是相当深远的一端。修复真正的问题。 – 2010-09-09 19:36:48

0

如果您有一些关于线程编程的特殊需求,SmartThreadPool项目可能会让您满意。