using Apewer.Web; using System; using System.Collections.Generic; using System.Reflection; using System.Text; namespace Apewer { /// Cron 特性,默认间隔为 60000 毫秒。 [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] public sealed class CronAttribute : Attribute { internal const int DefaultInterval = 60000; private int _interval; /// 两次 Cron 执行的间隔毫秒数。 public int Interval { get { return _interval; } } /// 创建 Cron 特性,可指定两次 Cron 执行的间隔毫秒数。 public CronAttribute(int interval = DefaultInterval) { _interval = interval; } #region CronInvoker private static Class _invoker = new Class(); /// 开始 Cron 调用(不阻塞当前线程)。 /// /// 参数
/// - assemblies: 包含 Cron 的程序集,不指定此参数时将在 AppDomain 中搜索;
/// - logger: 日志记录程序,不指定此参数时将使用 Logger.Default。
///
public static void Start(IEnumerable assemblies = null, Logger logger = null) { CronInvoker instance = null; lock (_invoker) { if (_invoker) return; instance = new CronInvoker(); _invoker.Value = instance; } instance.Logger = logger ?? Logger.Default; instance.Load(assemblies ?? AppDomain.CurrentDomain.GetAssemblies()); Console.CancelKeyPress += (s, e) => { Break(); e.Cancel = true; }; instance.Start(); } /// 在当前线程开始 Cron 调用(阻塞当前线程)。 /// /// 参数
/// - assemblies: 包含 Cron 的程序集,不指定此参数时将在 AppDomain 中搜索;
/// - logger: 日志记录程序,不指定此参数时将使用 Logger.Default。
///
public static void Start(Logger logger, IEnumerable assemblies = null) => Start(assemblies, logger); /// 打断 Cron 循环,不打断正在执行的 Cron。 public static void Break() { lock (_invoker) { if (!_invoker) return; _invoker.Value.Break(); } } #endregion } }