【问题标题】:Monitor Threads in Windows Service监视 Windows 服务中的线程
【发布时间】:2010-09-09 17:37:09
【问题描述】:

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

基本上我想做的是:

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

这看起来应该不是很难,但我不知道从哪里开始。

【问题讨论】:

  • 您能否向每个线程添加代码,这些代码将被定期调用以进行脉冲或以其他方式通知它仍然存在?

标签: c# multithreading windows-services


【解决方案1】:

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

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

【讨论】:

  • 这听起来不错。我刚刚创建了一个对象来存储有关线程正在处理的进程的信息。我会试试字典的想法。
  • 对于每个新线程,我将创建一个对象,其中包含我需要的所有信息,包括 ManagedThreadID。是否可以根据 ManagedThreadID 调用 thread.IsAlive?
  • IsAlive 是线程对象的属性。相反,将线程包含在您的信息对象中。
  • 这正是我最终所做的。谢谢!
【解决方案2】:

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

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

【讨论】:

  • 不幸的是,我继承了这个项目并且被线程卡住了。但我需要更多信息,而不仅仅是线程数来确定发生了什么。我需要将线程 ID 与线程正在处理的特定进程相关联,然后在线程关闭时通知 nagios。
  • 是的,一个有 60 个线程的项目往往会被频繁地继承。这真的很离谱。解决真正的问题。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多