我有一个用 C# 编写的 Windows 服务。它还包括一个独立的控制台模式,用于调试目的。它在几乎每台运行它的计算机上都可以正常工作,但是我们遇到了这样一种情况:当您尝试启动它时,该服务会锁定,然后由于超时而被终止。但是在同一台机器上以控制台模式运行它时,它可以正常启动。
调试很痛苦,因为我实际上无法访问正在发生这种情况的机器,我必须通过人工代理。但经过大量试错调试后,我终于将原因缩小到程序集负载。根据日志文件,当它第一次引用特定 dll 中的任何数据类型时,它就会停在那里。它甚至没有给出异常,它只是锁定了。
[编辑] 经过进一步检查,它似乎没有永久锁定,实际完成加载库只需要大约 40 秒,这足以让 Windows 服务决定终止该进程。
任何线索如何调试这种情况?
这是关于我可以重现它的最简单的解决方案。“之前”出现,但“期间”和“之后”不出现。
private static void LoadAssembly()
{
Log("During");
MyNameSpace.MyClass x = new MyNameSpace.MyClass();
}
static void Main(string[] args)
{
try
{
// Leaving out code to handle command line parameters
// ...
//
Log("Before");
LoadAssembly();
Log("After");
if (Environment.UserInteractive)
{
Log("Starting in console mode");
ConnectionManager.Listen();
}
else
{
Log("Starting in service mode");
ServiceBase.Run(new RunAsService());
}
}
catch (Exception ex)
{
Log(ex.ToString());
}
}