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