Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows服务中的监视线程_C#_Multithreading_Windows Services - Fatal编程技术网

C# Windows服务中的监视线程

C# Windows服务中的监视线程,c#,multithreading,windows-services,C#,Multithreading,Windows Services,我有一个windows服务,它启动时会产生大约60个线程。我使用Nagios进行常规监控,我有所有必要的例程向Nagios发送数据。但是,我不知道如何获得所有线程的总和,并确保它们都没有死亡 基本上我想做的是: foreach(thread t in threadPool) { if(t.isAlive()) { PingHost(t.ThreadID); } } 这似乎不是很难,但我不确定从哪里开始。只是一个评论,60是一个固定的数字,有很多线程。你可

我有一个windows服务,它启动时会产生大约60个线程。我使用Nagios进行常规监控,我有所有必要的例程向Nagios发送数据。但是,我不知道如何获得所有线程的总和,并确保它们都没有死亡

基本上我想做的是:

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

这似乎不是很难,但我不确定从哪里开始。

只是一个评论,60是一个固定的数字,有很多线程。你可能需要考虑一个处理循环(即使它有它自己的专用线程)——更容易调试和更可扩展。
但是如果你真的需要这个,一个选择是。。。当线程启动时,对一些共享计数器执行联锁增量。在线程完成其工作之前,执行联锁递减。

我建议将每个线程添加到由其
ManagedThreadId
键控的
字典中。然后将回调方法传递给每个线程,该线程在终止时返回其
ManagedThreadId
。然后回调从字典中删除线程并通知Nagios


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

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

不幸的是,我继承了这个项目,并坚持线程。但我需要更多的信息,而不仅仅是线程数来确定发生了什么。我需要将线程ID与线程正在处理的特定进程相关联,然后通知nagios线程是否已关闭。是的,具有60个线程的项目往往会频繁地被继承。这真是太离谱了。修复真正的问题。你能为每个线程添加代码,这些线程将被定期调用以脉冲或以其他方式通知它仍然处于活动状态吗?这听起来不错。我刚刚创建了一个对象来存储线程正在处理的进程的信息。我将尝试一下字典的想法。对于每个新线程,我将创建一个包含我需要的所有信息的对象,包括ManagedThreadID。是否可以基于ManagedThreadID调用thread.IsAlive?IsAlive是thread对象的属性。相反,在你的信息对象中包含线程。这正是我最终要做的。非常感谢。