C#windows服务程序

C#windows服务程序,c#,windows,service,C#,Windows,Service,我能够创建一个简单的windows服务应用程序。只是框架。但我还是很困惑。我应该将windows服务的代码放在哪里才能真正执行某些操作。我有一个单独的计划,我想在这里包括/调用/合并。 程序应该放在哪里?我应该从哪里开始 public partial class MyNewService : ServiceBase { public MyNewService() { InitializeComponent(); if (!System.Diagno

我能够创建一个简单的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);
    }
}
}

您需要重写该方法(以及其他类似方法,如
在顶部
在关闭时
,等等)


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

根据需要在
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);

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

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

protected override void OnStart(string[] args)
{
    //Do stuff here
}
在中,它表示覆盖
OnStart()


如果您不想使用该Windows服务程序模板,您可能希望使用该模板,从而使编程服务变得更加简单。现在,您构建的服务可执行文件不能直接运行,只能安装。Hoytsoft的库会在安装后自动为您运行,就像普通的Windows窗体应用程序一样。

您必须覆盖
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;
//将以下行更改为匹配。
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()方法以调用业务逻辑。如前所述,您可以创建另一个线程来实现该功能,也可以使用带有计时器的EventHandler(再次使用线程)来调用业务逻辑。服务必须将控制权返回给操作系统,因此在服务运行时,Onstart方法应将控制权返回给windows

要控制、暂停、恢复、关闭电源、停止事件,您需要覆盖这些方法并在其中写入逻辑