启动时 C# Windows 服务超时

标签 c# windows service timeout log4net

我在尝试确定用 C# 创建的 Windows 服务超时的原因时遇到了困难。 我花了相当多的时间查看有关该问题的多个帖子和主题,但我不确定还可以尝试什么。

有什么问题?

有时在某些运行我的 windows 服务的机器上,它在机器重新启动后没有成功启动。 我收到有关服务未能及时启动且在 30000 毫秒后超时的常见事件日志消息。 Windows Server 2003 机器似乎是最常见的模式,但并不总是与此操作系统隔离。例如,它在其他 W2K3 机器上工作得很好。

启动失败可能是随机的,有时会启动,有时会失败,因此很难按需重现问题。 我还使用 Log4Net 来捕获和错误并将它们记录到 RollingFileAppender。但是,当服务启动失败时,不会创建任何日志文件,也不会保存任何日志信息。 就好像我的服务入口线程正在阻塞并且没有被调用。

其他细节:

  1. Windows 服务用 C# 编写并使用 .Net 2.0
  2. 当我的服务没有其他服务依赖项时 安装。
  3. 服务 exe 是一个没有签名或验证码的发布版本 签名。
  4. OnStart 方法通过创建一个 线程并启动该线程。没有其他初始化发生 在 OnStart 中。
  5. 当服务确实无法启动时,打开服务 列出并手动启动它每次都有效,而且服务 可能不到一秒钟就会开始。

我将以下代码添加到我的 Program.cs,其中包括该服务的主要入口点。 我连接到 CurrentDomain 上的 UnhandledException 事件并使用 log4net 记录任何未处理的错误 ServiceBase 周围还有一个 try/catch。如果它以某种方式崩溃,请运行​​,以便我可以记录该错误。

static void Main()
{
    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[] 
    { 
        new SchedulerService() 
    };

    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

    try
    {
        ServiceBase.Run(ServicesToRun);
    }
    catch (Exception ex)
    {
        Log.Fatal("Unhandled Service Exception", ex);
    }
}

private static log4net.ILog _log = null;
static log4net.ILog Log
{
    get
    {
        if (_log == null)
        {
            if (!log4net.LogManager.GetRepository().Configured)
            {
                log4net.Config.XmlConfigurator.Configure();
            }

            _log = log4net.LogManager.GetLogger(typeof(Program));
        }
        return _log;
    }
}

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    Exception ex = e.ExceptionObject as Exception;
    if (ex == null) ex = new Exception(e.ExceptionObject.ToString());

    Log.Fatal("Unhandled Service Exception", ex);
}

我继承的ServiceBase实现中的代码如下:

protected override void OnStart(string[] args)
{
    Thread serviceThread = new Thread(new ThreadStart(BackgroundStart));
    serviceThread.IsBackground = true;
    serviceThread.Start();
}

private void BackgroundStart()
{
    //Initialize and start worker objects to perform monitoring...
    //<Snip>
}

我的 log4net 实现使用 ConsoleAppender 和 RollingFileAppender,其配置详细信息存储在 App.config 中。

在这个阶段,我不确定还能尝试什么。 如果需要更多详细信息,请告诉我。

谢谢。

更新: 只是为了更新每个人,我将尝试一些建议,例如直接记录到 EventLog 或一个文件而不是 Log4Net,看看是否是这个原因。 我还将尝试将 app.config 中的 generatePublisherEvidence 设置为 false。 我只是在等待适当的停机时间来访问客户端的服务器来测试这些东西。

最佳答案

我通过在配置文件中关闭发布者证据生成来解决类似问题。该服务也没有验证码签名,但添加以下行立即解决了机器上的问题,该问题一直被复制。

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

也在this MSDN source中推荐:
“我们建议服务使用该元素来提高启动性能。使用该元素还有助于避免可能导致超时和服务启动取消的延迟。”

关于启动时 C# Windows 服务超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7009759/

相关文章:

android - 在哪里可以找到有关 Android 的 "service call"shell 命令的信息?

java - Android:没有 onCreate() 方法的服务类

c# - 如何在 Windows 10 UWP 应用程序中播放 (MIDI) 声音?

jquery - 如何使用 JSONP 以及如何制作支持 JSONP 输出的 REST Web 服务?

c# - 在 Console.WriteLine 中传递值

python - Heroku Python 本地环境变量

windows - 检索powershell中日期范围内修改的文件的完整路径和文件权限

c# - 执行在c#中具有路径依赖性的批处理文件

c# - 无需装饰器的反序列化

c# - C#套接字BeginAccept事件停止触发