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.

83 lines
2.7 KiB

4 years ago
  1. using Apewer.Web;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Reflection;
  5. using System.Text;
  6. namespace Apewer
  7. {
  8. /// <summary>Cron 特性,默认间隔为 60000 毫秒。</summary>
  9. [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
  10. public sealed class CronAttribute : Attribute
  11. {
  12. internal const int DefaultInterval = 60000;
  13. private int _interval;
  14. /// <summary>两次 Cron 执行的间隔毫秒数。</summary>
  15. public int Interval
  16. {
  17. get { return _interval; }
  18. }
  19. /// <summary>创建 Cron 特性,可指定两次 Cron 执行的间隔毫秒数。</summary>
  20. public CronAttribute(int interval = DefaultInterval)
  21. {
  22. _interval = interval;
  23. }
  24. #region CronInvoker
  25. private static Class<CronInvoker> _invoker = new Class<CronInvoker>();
  26. /// <summary>开始 Cron 调用(不阻塞当前线程)。</summary>
  27. /// <remarks>
  28. /// 参数<br />
  29. /// - assemblies: 包含 Cron 的程序集,不指定此参数时将在 AppDomain 中搜索;<br />
  30. /// - logger: 日志记录程序,不指定此参数时将使用 Logger.Default。<br />
  31. /// </remarks>
  32. public static void Start(IEnumerable<Assembly> assemblies = null, Logger logger = null)
  33. {
  34. CronInvoker instance = null;
  35. lock (_invoker)
  36. {
  37. if (_invoker) return;
  38. instance = new CronInvoker();
  39. _invoker.Value = instance;
  40. }
  41. instance.Logger = logger ?? Logger.Default;
  42. instance.Load(assemblies ?? AppDomain.CurrentDomain.GetAssemblies());
  43. Console.CancelKeyPress += (s, e) =>
  44. {
  45. Break();
  46. e.Cancel = true;
  47. };
  48. instance.Start();
  49. }
  50. /// <summary>在当前线程开始 Cron 调用(阻塞当前线程)。</summary>
  51. /// <remarks>
  52. /// 参数<br />
  53. /// - assemblies: 包含 Cron 的程序集,不指定此参数时将在 AppDomain 中搜索;<br />
  54. /// - logger: 日志记录程序,不指定此参数时将使用 Logger.Default。<br />
  55. /// </remarks>
  56. public static void Start(Logger logger, IEnumerable<Assembly> assemblies = null) => Start(assemblies, logger);
  57. /// <summary>打断 Cron 循环,不打断正在执行的 Cron。</summary>
  58. public static void Break()
  59. {
  60. lock (_invoker)
  61. {
  62. if (!_invoker) return;
  63. _invoker.Value.Break();
  64. }
  65. }
  66. #endregion
  67. }
  68. }