C#服务程序

本文关键字:服务程序 | 更新日期: 2023-09-27 18:28:08

我能够创建一个简单的windows服务应用程序。只是框架。但我还是很困惑。我应该把windows服务的代码放在哪里才能真正执行某些操作。我有一个单独的程序,我想在这里包括/调用/合并。程序应该放在哪里?我应该从哪里开始?

public partial class MyNewService : ServiceBase
{
    public MyNewService()
    {
        InitializeComponent();
        if (!System.Diagnostics.EventLog.SourceExists("MySource"))
        {
            System.Diagnostics.EventLog.CreateEventSource(
                "MySource", "MyNewLog");
        }
        eventLog1.Source = "MySource";
        eventLog1.Log = "MyNewLog";
    }


    static void Main()
    {
        System.ServiceProcess.ServiceBase[] ServicesToRun;
        // Change the following line to match.
        ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyNewService() };
        System.ServiceProcess.ServiceBase.Run(ServicesToRun);
    }
}

}

C#服务程序

您需要覆盖OnStart方法(以及其他类似的方法,如OnStopOnShutdown等)。

执行此操作时,请确保OnStart方法不会阻塞或执行时间过长。这通常意味着在自己的线程中运行实际的服务逻辑。

在本演练中,它指示您覆盖OnStart()

如果你不想使用Windows服务程序模板,你可能想看看这个库,它可以让编程服务变得更容易。现在,您构建的服务可执行文件不能直接运行,只能安装。Hoytsoft的库安装后自动为您运行,就像普通的Windows窗体应用程序一样。

根据需要在MyNewService上覆盖以下方法:

protected virtual void OnContinue();
protected virtual void OnCustomCommand(int command);
protected virtual void OnPause();
protected virtual bool OnPowerEvent(PowerBroadcastStatus powerStatus);
protected virtual void OnSessionChange(SessionChangeDescription changeDescription);
protected virtual void OnShutdown();
protected virtual void OnStart(string[] args);

您对使用On____方法发送的各种事件作出反应(它们是虚拟的,因此您可以覆盖它们)。

特别是在最简单的情况下:

protected override void OnStart(string[] args)
{
    //Do stuff here
}

您必须覆盖OnStart()函数。我建议将当前构造函数中的所有代码移到同一个函数中,因为建议将构造函数留空(这不仅适用于服务,而且是另一回事)。一开始,你通常会旋转一个或多个线程来完成你想要的工作记住OnStart()必须尽可能返回您可能还需要在OnStop()函数中实现一些逻辑,以便优雅地阻塞工作线程。

正如前面所说,不要将代码放在OnStart()中。为什么?因为如果你的OnStart()方法没有很快返回,服务管理器会将你的服务标记为无响应,并将你关闭。

所以,我把代码放在一个Start()方法中,OnStart()所做的就是调用Start()。像这样:

    protected override void OnStart(string[] args)
    {
        Start();
    }
    public static void Start()
    {
       ... do stuff
    }

此外,请注意,启动服务的代码的行为会有所不同,这取决于您是处于编译模式还是调试模式。

System.ServiceProcess.ServiceBase[] ServicesToRun; // Change the following line to match. ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyNewService() }; System.ServiceProcess.ServiceBase.Run(ServicesToRun);

我这样做是为了确保它的行为正确,而且我不必记得为了运行或调试而来回更改代码。

        if(Debugger.IsAttached)
            Service.Start();
        else
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] 
            { 
                new Service() 
            };
            ServiceBase.Run(ServicesToRun);
        }

重写OnStart()方法以调用业务逻辑。如前所述,您可以创建另一个线程来具有该功能,也可以使用带有Timers的Eventhandlers(再次使用线程)来调用busineess逻辑。服务必须将控制权返回给操作系统,因此Onstart方法应在服务运行时将控制权返回到窗口。

要控制Pause、Resume、on Power Shutdown、on Stop事件,您需要覆盖这些方法并在其中写入逻辑。