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