C# Windows服务启动速度不够快

5
我有一个C# Windows服务。 OnStart()方法包含3行代码,它们的作用仅是启动一个线程。该类本身没有静态对象会导致延迟。它就像一个服务可以这么简单。我的代码由自制密钥签名。
编辑:我刚刚发现程序集未经过签名,其他都已签名。它使用了一些已签名的程序集,但服务本身并没有签名。
此代码在虚拟机中运行,每当主机运行缓慢且此VM正在引导时,服务将无法启动,并显示以下错误:

等待ServiceName服务连接时达到超时(30000毫秒)。

将服务设置为延迟启动可以解决问题,但是这是一个长时间的延迟,非常烦人。有没有其他人遇到过.NET服务(2.0)的这个问题?
OnStart方法:
protected override void OnStart(string[] args)
{
    Thread startThread = new Thread(new ThreadStart(StartThread));
    startThread.IsBackground = true;
    startThread.Start();
}

StartThread方法中,我只是调用另一个类,这样OnStart就不必等待静态变量初始化或构造方法结束。

private void StartThread()
{
    Worker mainThread = new Worker(this);
    mainThread.RunWorker();
}

感谢您的选择。

1
线程做什么?它正在使用庞大的数据库查询初始化数据吗?它正在连接到另一个TCP/IP客户端/服务器吗? - Jess
1
OnStart 中展示你的代码。 - jgauffin
@mntgoat,你试过我的签名建议了吗? - Can Gencer
@casolorz 五年过去了,您是否对此问题有更深入的了解?我在我的测试虚拟机上遇到了完全相同的错误,并且 OnStart() 基本上与您上面的代码相同。您是否找到了明确的原因? - khargoosh
@khargoosh 抱歉,我不太记得这个问题的细节了,而且我也不再在我写那段代码的公司工作了。听起来好像混合使用有符号和无符号程序集可能是问题的一部分。 - casolorz
显示剩余3条评论
2个回答

0

我认为这很可能是由于您在可执行文件上进行的强名称签名造成的。一般来说,对于可执行文件来说,这不是一个好的做法(请参见此处)。我在我的一个项目中也遇到了同样的问题,其中一个可执行文件启动需要花费极长的时间,结果发现是因为对可执行文件进行了强名称签名(.NET 2.0 也是如此)。


我刚刚发现汇编代码没有签名,其他都有。它使用了一些已签名的程序集,但服务本身没有签名。 - casolorz
我使用log4net的rollingfile appender,不确定是否会造成问题。 - casolorz
你可以尝试在这里和那里添加一些跟踪消息,然后尝试查看应用程序的运行情况。在我的情况下,onstart代码甚至都没有被执行。 - Can Gencer
我尝试将log4net的初始化推迟到更晚的时间,但并没有帮助。 - casolorz
尝试移除所有的签名,看看会发生什么 :) - Can Gencer
显示剩余5条评论

0
考虑将AutoLog = false。我见过这个标志会导致你描述的超时问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接