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

  1. using Apewer.Internals.Interop;
  2. using System;
  3. using System.Diagnostics;
  4. using System.ServiceProcess;
  5. namespace Apewer.WinForm
  6. {
  7. /// <summary>Windows 服务。</summary>
  8. public class WindowsService : ServiceBase
  9. {
  10. Action on_start = null;
  11. Action on_stop = null;
  12. /// <summary>创建 Windows 服务实例。</summary>
  13. /// <param name="serviceName">服务名称。</param>
  14. /// <param name="onStart">服务启动后,在后台线程执行的程序。</param>
  15. /// <param name="onStop">服务停止前,同步执行的程序。</param>
  16. /// <exception cref="ArgumentNullException"></exception>
  17. /// <exception cref="ArgumentException"></exception>
  18. public WindowsService(string serviceName, Action onStart, Action onStop)
  19. {
  20. if (serviceName.IsEmpty()) throw new ArgumentNullException(nameof(serviceName));
  21. ServiceName = serviceName;
  22. on_start = onStart;
  23. on_stop = onStop;
  24. }
  25. /// <summary>创建 Windows 服务实例。</summary>
  26. /// <remarks>默认使用当前进程名称作为服务名称。</remarks>
  27. /// <param name="onStart">服务启动后,在后台线程执行的程序。</param>
  28. /// <param name="onStop">服务停止前,同步执行的程序。</param>
  29. /// <exception cref="ArgumentException"></exception>
  30. public WindowsService(Action onStart, Action onStop) : this(Process.GetCurrentProcess().ProcessName, onStart, onStop) { }
  31. /// <summary>服务启动时执行的程序。</summary>
  32. protected override void OnStart(string[] args) => RuntimeUtility.InBackground(on_start);
  33. /// <summary>服务停止时执行的程序。</summary>
  34. protected override void OnStop() => on_stop?.Invoke();
  35. /// <summary>启动 Windows 服务实例。</summary>
  36. /// <param name="serviceName">服务名称。</param>
  37. /// <param name="onStart">服务启动后,在后台线程执行的程序。</param>
  38. /// <param name="onStop">服务停止前,同步执行的程序。</param>
  39. /// <exception cref="ArgumentNullException"></exception>
  40. /// <exception cref="ArgumentException"></exception>
  41. public static WindowsService Run(string serviceName, Action onStart, Action onStop = null)
  42. {
  43. var service = new WindowsService(serviceName, onStart, onStop);
  44. ServiceBase.Run(service);
  45. return service;
  46. }
  47. /// <summary>启动 Windows 服务实例。</summary>
  48. /// <remarks>默认使用当前进程名称作为服务名称。</remarks>
  49. /// <param name="onStart">服务启动后,在后台线程执行的程序。</param>
  50. /// <param name="onStop">服务停止前,同步执行的程序。</param>
  51. /// <exception cref="ArgumentException"></exception>
  52. public static WindowsService Run(Action onStart, Action onStop = null) => Run(Process.GetCurrentProcess().ProcessName, onStart, onStop);
  53. }
  54. }