C# Windows服务程序

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

}

7个回答

3
你需要重写 OnStart 方法(以及其他类似的方法,如OnStopOnShutdown等)。
在这样做时,请确保你的OnStart方法不会阻塞或执行时间过长。这通常意味着在自己的线程中运行实际的服务逻辑。

1
这个演练中,它说你需要覆盖OnStart()方法。
如果你不局限于使用Windows服务程序模板,你可能想要查看这个库,它可以让编写服务变得更加容易。现在,你构建的服务可执行文件不能直接运行-只能安装。Hoytsoft的库会安装并在之后自动运行它,就像普通的Windows Form应用程序一样。

0

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

0

通过使用On____方法(它们是虚拟的,因此您可以重写它们),来响应发送的各种事件。

具体而言,在最简单的情况下:

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

0
正如所说,不要将您的代码放在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);
        }

0

重写OnStart()方法以调用您的业务逻辑。如前所述,您可以创建另一个线程来实现功能,或者使用带有计时器的事件处理程序(再次使用线程)来调用业务逻辑。服务必须将控制权返回给操作系统,因此在服务运行时,Onstart方法应将控制权返回给Windows。

要控制、暂停、恢复、关闭电源和停止事件,您需要重写这些方法并在其中编写您的逻辑。


0

你必须重写 OnStart() 函数。我建议将当前构造函数中的所有代码移动到同一个函数中,因为推荐将构造函数保持为空(这不仅适用于服务,但这是另一回事)。在启动时,通常会旋转一个或多个线程来执行所需的工作。请记住,OnStart() 必须尽可能快地返回。 你可能还需要在 OnStop() 函数中实现一些逻辑,以便优雅地阻止工作线程。


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