Browse Source

增加 WindowsService 类。

master
王厅 15 hours ago
parent
commit
6f3aa9c9c1
  1. 23
      Apewer.Windows/WinForm/Tray.cs
  2. 66
      Apewer.Windows/WinForm/WindowsService.cs

23
Apewer.Windows/WinForm/Tray.cs

@ -354,31 +354,10 @@ namespace Apewer.WinForm
public static void Service(Action onStart, Action onStop = null)
{
var processName = Process.GetCurrentProcess().ProcessName;
var service = new TrayService(processName, onStart, onStop);
var service = new WindowsService(processName, onStart, onStop);
ServiceBase.Run(service);
}
class TrayService : ServiceBase
{
Action on_start;
Action on_stop;
public TrayService(string serviceName, Action onStart, Action onStop)
{
if (serviceName.IsEmpty()) throw new ArgumentNullException(nameof(serviceName));
if (onStart == null) throw new ArgumentNullException(nameof(onStart));
ServiceName = serviceName;
on_start = onStart;
on_stop = onStop;
}
protected override void OnStart(string[] args) => RuntimeUtility.InBackground(on_start);
protected override void OnStop() => on_stop?.Invoke();
}
#endregion
}

66
Apewer.Windows/WinForm/WindowsService.cs

@ -0,0 +1,66 @@
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);
}
}
Loading…
Cancel
Save