gpt4 book ai didi

启动时 C# Windows 服务超时

转载 作者:可可西里 更新时间:2023-11-01 12:23:56 26 4
gpt4 key购买 nike

我在尝试确定用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com