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);
}
}
}
您需要覆盖OnStart方法(以及其他类似的方法,如OnStop
、OnShutdown
等)。
执行此操作时,请确保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事件,您需要覆盖这些方法并在其中写入逻辑。