已安装视窗服务,但无法正常工作

本文关键字:常工作 工作 安装 服务 | 更新日期: 2023-09-27 18:31:48

我创建了一个Windows服务并为它创建了安装程序。它已安装并启动,但我在其中编写的代码无法执行。实际上,当我从服务窗口启动服务时,OnStart() 函数不会触发。既不是 initializecomponent() 也不是 static void main 函数。任何人都可以帮我吗

请引导我做错的地方。

下面是一些代码行。 如果你想要更多我写的东西,请告诉我

public partial class iMArchiveService : ServiceBase
{
    Boolean isArchiving = false;
    public iMArchiveService()
    {
        MyException.CreateLog("iMArchiveService: Inside Constructor. Initializing Component");
        InitializeComponent();
        MyException.CreateLog("iMArchiveService: Component Initialized. Timer is set as: " + TimeMachine.Interval.ToString() + " milliseconds");
    }
    protected void TimeMachine_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        try
        {
            MyException.CreateLog("iMArchiveService: Inside Tick Try. Value of isArchiving variable before condition is: " + isArchiving.ToString());
            if (!isArchiving)
                isArchiving = new iM.OrderArchiving.ArchiveOrderXML().ArchiveOrderService();
            MyException.CreateLog("iMArchiveService: Inside Tick Try. Value of isArchiving variable after condition is: " + isArchiving.ToString());
        }
        catch (Exception ex)
        {
            MyException.CreateLog("iMArchiveService: Inside Tick Catch :(");
        }
    }
    protected override void OnStart(string[] args)
    {
        TimeMachine.Enabled = true;
        MyException.CreateLog("iMArchiveService Started: " + DateTime.Now.ToString());
    }
    protected override void OnStop()
    {
        TimeMachine.Enabled = false;
        MyException.CreateLog("iMArchiveService Stopped: " + DateTime.Now.ToString());
    }
}

上面的代码用于服务文件.cs

这是我的项目安装程序文件

namespace iM.OrderArchivingService
{
    [RunInstaller(true)]
    public partial class ProjectInstaller : Installer
    {
        public ProjectInstaller()
        {
        InitializeComponent();
        }
    }
}

这里是 InitializeComponenet 函数 -

private void InitializeComponent()
    {
        this.myServiceProcessInstaller = new System.ServiceProcess.ServiceProcessInstaller();
        this.myServiceInstaller = new System.ServiceProcess.ServiceInstaller();
        // 
        // myServiceProcessInstaller
        // 
        this.myServiceProcessInstaller.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
        this.myServiceProcessInstaller.Installers.AddRange(new System.Configuration.Install.Installer[] {
        this.myServiceInstaller});
        this.myServiceProcessInstaller.Password = null;
        this.myServiceProcessInstaller.Username = null;
        // 
        // myServiceInstaller
        // 
        this.myServiceInstaller.ServiceName = "iMArchiveService";
        // 
        // ProjectInstaller
        // 
        this.Installers.AddRange(new System.Configuration.Install.Installer[] {
        this.myServiceProcessInstaller});
    }

这是程序.cs文件

namespace iM.OrderArchivingService
{
static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    static void Main(string[] args)
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] { new iMArchiveService() };
        ServiceBase.Run(ServicesToRun);
    }
}
}

如您所见,我已经编写了代码以在初始化或启动时进行记录......但是没有进行任何记录。

编辑:

定时器代码(时间机器)

    private void InitializeComponent()
    {
        this.components = new System.ComponentModel.Container();
        this.TimeMachine = new System.Timers.Timer(3600000);
        // 
        // TimeMachine
        // 
        this.TimeMachine.Interval = 3600000;
        this.TimeMachine.Elapsed += new System.Timers.ElapsedEventHandler(TimeMachine_Elapsed);
        // 
        // iMArchiveService
        // 
        this.ServiceName = "iMArchiveService";
    }

已安装视窗服务,但无法正常工作

你用错了Timer类 - 线索在它的命名空间中:System.Windows.Forms.Timer 。该计时器仅适用于WinForms应用程序。

相反,您应该切换到使用System.Timers.Timer


System.Threading.Timer中有一个关于计时器类的一般讨论:

System.Threading.Timer 是一个简单、轻量级的计时器,它使用回调方法,由线程池线程提供服务。不建议将其与 Windows 窗体一起使用,因为它的回调不会在用户界面线程上发生。 System.Windows.Forms.Timer是与 Windows 窗体一起使用的更好选择。对于基于服务器的计时器功能,可以考虑使用 System.Timers.Timer ,它会引发事件并具有其他功能。

(我的强调取代了原来)

不要在 Windows 服务中使用 System.Windows.Forms.Timer,它可能不会在其中引发事件。请参阅 Windows 窗体计时器事件未在 Windows 服务中引发。

在 Windows 服务中使用 System.Timers.TimerSystem.Threading.Timer。请参阅 Windows 服务和计时器。

请检查TimeMachine.Enable = True,并设置定时器是否定时。

参考此链接

http://codesimplified.com/2010/12/31/creating-window-service-with-net-vs2008/

也许你应该使用 Timer.Start() 和

Timer.Stop() 方法来启动和停止计时器,以防万一使用 Enabled 属性出现问题。

间隔周期为 3,600,000,即 3600 秒或 60 分钟 = 1 小时。 在一个小时过去之前,什么都不会发生;这是你的意图?

顺便说一句,像下面的示例一样设置间隔将使您的代码更易于阅读:

this.TimeMachine.Interval = 1 * 1000;  // 1 Second
this.TimeMachine.Interval = 60 * 1000; // 60 Seconds
this.TimeMachine.Interval = 60 * 60 * 1000; // 1 hour

尝试在 System.Diagnostics 中使用 Debug.Writeline() 方法。 默认情况下,这将在 MSVS 的"输出"窗口中发布消息。 您也会在那里看到任何例外。