C# 当控制台应用程序使用完全相同的基本库执行完全相同的操作时,什么会导致Windows服务挂起';T

C# 当控制台应用程序使用完全相同的基本库执行完全相同的操作时,什么会导致Windows服务挂起';T,c#,windows-services,C#,Windows Services,我讨厌问这样的问题-它们太不明确了。。。不可定义,但这里有 背景: 我有一个DLL,它是一个定时进程应用程序的核心。我的计时器接收其运行时间间隔的配置,以及在时间间隔结束时应运行的委托。我有另一个DLL,其中包含我注入的进程 我创建了两个应用程序,一个Windows服务和一个控制台应用程序。每个应用程序都读取自己的配置文件并加载相同的库,将配置的计时器间隔和委托推送到我的定时进程类中 问题: 昨天和过去的n周里,在我们使用Windows服务的生产环境中,一切正常。今天,Windows服务将运行约

我讨厌问这样的问题-它们太不明确了。。。不可定义,但这里有

背景: 我有一个DLL,它是一个定时进程应用程序的核心。我的计时器接收其运行时间间隔的配置,以及在时间间隔结束时应运行的委托。我有另一个DLL,其中包含我注入的进程

我创建了两个应用程序,一个Windows服务和一个控制台应用程序。每个应用程序都读取自己的配置文件并加载相同的库,将配置的计时器间隔和委托推送到我的定时进程类中

问题:
昨天和过去的n周里,在我们使用Windows服务的生产环境中,一切正常。今天,Windows服务将运行约20-30分钟并挂起(计时器间隔为30秒),但控制台应用程序运行时没有问题,在过去4小时内没有问题。详细的日志记录并不表示有任何故障。这就好像Windows服务只是……悄无声息地死去——没有停止

考虑到我的Windows服务和控制台应用程序正在做完全相同的事情,我只能认为是某种原因导致Windows服务进程挂起,但我不知道是什么原因导致了挂起。我已经检查了配置文件,它们都是相同的——我甚至复制并粘贴了其中一个文件的内容到另一个文件中,只是为了确定。没有骰子

当使用相同基本库的对应控制台应用程序没有挂起Windows服务时,是否有人可以就什么可能导致Windows服务挂起提出建议;或者有人能给我指点工具的方向,让我诊断出是什么导致了这个问题


谢谢大家的帮助-还在挖掘中。

我可能会输入一些文件日志,看看程序进展如何。它可以让您更好地了解什么是循环/挂起/死锁/崩溃。

您可以尝试这些技术

  • 记录开始记录服务中的代码流。基于此参数,这样在完成后就不会出现洪水。您应该记录所有函数名、参数和时间戳

  • 附加调试器本地或远程将带有代码的调试器附加到正在运行的服务,设置适当的断点(可以基于从日志记录中收集的数据)

  • PerfMon运行此实用程序并收集有关运行服务的机器的信息,以获取任何其他线索(CPU峰值高、IO峰值高、分页过多等)


微软在这方面提供了很好的资源。考虑到你的问题如此笼统,这听起来很像你必须要做的事情。话虽如此,在过去几天里,是否对系统进行了任何可能对服务产生不利影响的更改?您是否对代码进行了任何更新,以改变服务可能的工作方式


同样,我认为您必须进行一些认真的调试才能发现问题。

您在windows服务中使用的是什么类型的计时器?我在电视上看到过很多人在定时器和windows服务方面有问题。这是一个很好的教程,只是为了确保您设置正确,并使用正确类型的计时器。希望这会有所帮助。

您需要了解生产服务器上发生了什么变化。一开始,负责IT的人会发誓什么都没有改变,但你必须坚持不懈。我经常看到这种情况,我数不清软件不会损坏。句号。更改必须与环境有关

执行差异:您有两个应用程序运行相同的代码。最可能的区别(也是罪魁祸首)是,该服务运行时使用的安全凭据集与您的控制台应用程序不同,并且可能成为安全异常行为的受害者。先检查一下。哪个Windows帐户正在运行该服务?它的作用和范围是什么?是否有任何第三方安全软件在服务器上运行,可能会杀死错误的应用程序?您是否必须向第三方安全服务注册您的服务?您的.Net程序集是否已正确签名?您的.Net程序集是否在服务器上正确注册和配置?最后但并非最不重要的一点是,不要忘记调试器用户(您最有可能是调试器用户)比许多其他帐户类型可以获得更多的东西


另一个想法:由于计时似乎是问题的一部分,请检查机器上的计划任务。也许有一个过程设置为每30分钟进行一次,这会干扰你自己的过程

您可以通过调试Windows服务。这可以帮助您通过设置(可能是有条件的)断点来隔离问题

或者,您可以使用Visual Studio“附加到进程”对话框窗口查找服务进程,并在启用“调试CLR”选项的情况下附加到该服务进程。这同样允许您根据需要设置断点

你在使用断言吗?如果一个断言在没有被重新定向为写入日志文件的情况下触发,您的服务将挂起。如果代码抛出未经处理的异常,可能是因为内存泄漏,那么您的服务进程将崩溃。如果将服务控制管理器(SCM)设置为在发生崩溃时重新启动进程,则应该能够看到服务已重新启动。由于在这两种环境中运行的代码相同,因此这两种情况似乎不太可能发生。但请记住,您的服务是由SCM托管的,这意味着与您的console应用程序运行的环境截然不同

我经常使用“heartbeat”,即服务中的每个活动线程向本地MSMQ发送一条常规(比如每30秒一次)消息。这使得manua