【问题标题】:Windows service locks up on assembly loadWindows 服务锁定程序集负载
【发布时间】:2010-09-16 00:03:41
【问题描述】:

我有一个用 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());
    }
}

【问题讨论】:

    标签: c# .net windows-services assembly-resolution


    【解决方案1】:

    程序集需要 45 秒才能连接,它会在加载程序集之前尝试连接到 Internet 以验证有关程序集的某些信息,但在该特定计算机上它被防火墙阻止了。尝试启动 30 秒后,Windows 服务管理器放弃并终止进程。

    将程序集的加载移动到服务启动之后才能正常启动(尽管在它开始响应之前有 45 秒的延迟)。

    这似乎与生成出版商证据有关。从这里http://msdn.microsoft.com/en-us/library/bb629393.aspx:

    我们建议服务使用该元素来提高启动性能。使用此元素还可以帮助避免可能导致超时和取消服务启动的延迟。

    将以下内容放在 app.config 文件中消除了延迟:

    <configuration>
        <runtime>
            <generatePublisherEvidence enabled="false"/>
        </runtime>
    </configuration>
    

    【讨论】:

      【解决方案2】:

      您是否在持有加载程序锁的同时进行模块加载?

      调试见这篇文章:http://msdn.microsoft.com/en-us/library/ms172219.aspx

      【讨论】:

      • 对不起,我之前没有示例代码。加载程序锁定是我的第一个想法,但我真的不知道在这种情况下会发生这种情况。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多