You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
3.0 KiB
66 lines
3.0 KiB
using Apewer.Internals.Interop;
|
|
using System;
|
|
using System.Diagnostics;
|
|
using System.ServiceProcess;
|
|
|
|
namespace Apewer.WinForm
|
|
{
|
|
|
|
/// <summary>Windows 服务。</summary>
|
|
public class WindowsService : ServiceBase
|
|
{
|
|
|
|
Action on_start = null;
|
|
Action on_stop = null;
|
|
|
|
/// <summary>创建 Windows 服务实例。</summary>
|
|
/// <param name="serviceName">服务名称。</param>
|
|
/// <param name="onStart">服务启动后,在后台线程执行的程序。</param>
|
|
/// <param name="onStop">服务停止前,同步执行的程序。</param>
|
|
/// <exception cref="ArgumentNullException"></exception>
|
|
/// <exception cref="ArgumentException"></exception>
|
|
public WindowsService(string serviceName, Action onStart, Action onStop)
|
|
{
|
|
if (serviceName.IsEmpty()) throw new ArgumentNullException(nameof(serviceName));
|
|
|
|
ServiceName = serviceName;
|
|
on_start = onStart;
|
|
on_stop = onStop;
|
|
}
|
|
|
|
/// <summary>创建 Windows 服务实例。</summary>
|
|
/// <remarks>默认使用当前进程名称作为服务名称。</remarks>
|
|
/// <param name="onStart">服务启动后,在后台线程执行的程序。</param>
|
|
/// <param name="onStop">服务停止前,同步执行的程序。</param>
|
|
/// <exception cref="ArgumentException"></exception>
|
|
public WindowsService(Action onStart, Action onStop) : this(Process.GetCurrentProcess().ProcessName, onStart, onStop) { }
|
|
|
|
/// <summary>服务启动时执行的程序。</summary>
|
|
protected override void OnStart(string[] args) => RuntimeUtility.InBackground(on_start);
|
|
|
|
/// <summary>服务停止时执行的程序。</summary>
|
|
protected override void OnStop() => on_stop?.Invoke();
|
|
|
|
/// <summary>启动 Windows 服务实例。</summary>
|
|
/// <param name="serviceName">服务名称。</param>
|
|
/// <param name="onStart">服务启动后,在后台线程执行的程序。</param>
|
|
/// <param name="onStop">服务停止前,同步执行的程序。</param>
|
|
/// <exception cref="ArgumentNullException"></exception>
|
|
/// <exception cref="ArgumentException"></exception>
|
|
public static WindowsService Run(string serviceName, Action onStart, Action onStop = null)
|
|
{
|
|
var service = new WindowsService(serviceName, onStart, onStop);
|
|
ServiceBase.Run(service);
|
|
return service;
|
|
}
|
|
|
|
/// <summary>启动 Windows 服务实例。</summary>
|
|
/// <remarks>默认使用当前进程名称作为服务名称。</remarks>
|
|
/// <param name="onStart">服务启动后,在后台线程执行的程序。</param>
|
|
/// <param name="onStop">服务停止前,同步执行的程序。</param>
|
|
/// <exception cref="ArgumentException"></exception>
|
|
public static WindowsService Run(Action onStart, Action onStop = null) => Run(Process.GetCurrentProcess().ProcessName, onStart, onStop);
|
|
|
|
}
|
|
|
|
}
|
|
|