C# 在启动 Windows 服务时出现错误 1053

4
我有一个关于 Windows Service 应用程序的问题。该应用程序有一个定时器,在每 x 秒执行一次函数。
在本地开发者 PC 上测试应用程序时,服务能正常工作。
但是,在 Windows Server 2008 上测试服务,同时编译为 Release 模式时,当我启动服务时,会出现以下错误信息:

Error 1053: The service did not respond to the start or control request in a timely fashion

如果我查看服务器事件查看器,会得到以下信息:

Error from error viewer

下面是我的代码片段。
private const int TICK_TIMER = 120000; //Start timer every 2 minutes
private Timer readTimer = null;

public BarcodeReader()
{
    InitializeComponent();
}

protected override void OnStart(string[] args)
{
    readTimer = new Timer();
    readTimer.Interval = TICK_TIMER;
    readTimer.Elapsed += readTimer_Tick;
    readTimer.Enabled = true;
    WriteLog("Servizio Barcode started");
}

private void readTimer_Tick(object sender, ElapsedEventArgs e)
{
    //Start function
    try
    {
        MyFunction();
    }
    catch (Exception ex)
    {
        WriteLog("ERROR: " + ex.Message);
    }
}

private void WriteLog(string mex)
{
    try
    {
        //sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\LogFile.txt", true);
        using (var sw = new StreamWriter(Globals.LogPath + "LogBarcodeService.txt", true))
        {
            sw.WriteLine(DateTime.Now.ToString(CultureInfo.CurrentCulture) + ": " + mex);
            sw.Flush();
            sw.Close();
        }
    }
    catch (Exception)
    {

        throw;
    }
}

protected override void OnStop()
{
    readTimer.Enabled = false;
    WriteLog("Servizio Barcode terminated");
}

注意:服务器上安装了.NET Framework 4.5,与开发者PC相同。


更新

这是对InitializeComponent函数的调用。

namespace BarcodeReaderService
{
    partial class BarcodeReader
    {
        /// <summary> 
        /// Variabile di progettazione necessaria.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Pulire le risorse in uso.
        /// </summary>
        /// <param name="disposing">ha valore true se le risorse gestite devono essere eliminate, false in caso contrario.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Codice generato da Progettazione componenti

        /// <summary> 
        /// Metodo necessario per il supporto della finestra di progettazione. Non modificare 
        /// il contenuto del metodo con l'editor di codice.
        /// </summary>
        private void InitializeComponent()
        {
            components = new System.ComponentModel.Container();
            this.ServiceName = "Service1";
        }

        #endregion
    }
}

更新2

我尝试将所有代码放入一个应用程序控制台,并在服务器上顺利运行它们。


@Sven 这个项目是Windows服务,我不明白为什么开发者的电脑可以工作。那么错误也应该在那里出现吗? - Lorenzo Belfanti
你缺少一个依赖项。请在InitializeComponent调用中展示代码。 - Sven
@Sven 我已经按要求添加了。 - Lorenzo Belfanti
我猜你的服务应该在某些时候读取条形码,并且有一些关于条形码扫描器的参考资料。这些可能会缺失。 - Sven
@Sven 我们如何找出缺失的部分? - Lorenzo Belfanti
显示剩余5条评论
2个回答

2
解决方案应该是将输出目录(如bin\Debug)中的所有内容复制到服务器上的某个文件夹中。从那里,您可以运行InstallUtil来注册服务。
另一种方法是为Windows服务创建一个安装程序。

1

需要检查的一件事是您的开发机和服务器之间的.Net框架版本。

当我们的开发机有.Net 4.7(目前最新版本)而服务器有4.5时,我们遇到了类似的问题。

在我们的情况下,我们还在事件查看器中记录了以下内容

第一个异常

框架版本:v4.0.30319

描述:由于未处理的异常,进程被终止。

异常信息:System.IO.FileLoadException

第二个异常条目

故障模块名称:KERNELBASE.dll,版本:6.3.9600.18340,时间戳:0x5736541b

异常代码:0xe0434352

故障偏移量:0x00014878

您可以使用此指南找到确切的版本: https://learn.microsoft.com/en-us/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed

请注意,后续版本是就地升级!因此,一旦您拥有最新版本,就无法返回旧版本!

https://learn.microsoft.com/en-us/dotnet/framework/install/guide-for-developers

.NET Framework 4.x的较新版本是对早期版本的就地更新,这意味着如果已安装了较新版本,则无法安装表中列出的早期版本。

我已经检查了服务器的版本,它是.NET 4.5。 我尝试在新解决方案中创建一个没有任何引用的新项目,在这种情况下它可以工作。 问题是我有很多功能在主程序中,我需要进行这些引用以使用它们。 - Lorenzo Belfanti
你的情况似乎是缺少某些引用的文件 / DLL。由于服务没有给出完整的异常 - 你能否尝试在你的 OnStart 块中添加 try / catch 块,看看异常是否提供了更多的详细信息?请参考以下相关内容: https://dev59.com/9ms05IYBdhLWcg3wLO2Q?rq=1 - Subbu
我尝试将所有代码放入一个应用程序控制台,并在服务器上顺利运行它们。 - Lorenzo Belfanti

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