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
}
}