Browse Source

Cron 增加强制打断命令。

master
王厅 3 days ago
parent
commit
7babd72908
  1. 46
      Apewer/CronAttribute.cs

46
Apewer/CronAttribute.cs

@ -194,6 +194,7 @@ namespace Apewer
static CronAttribute[] _crons = null;
static bool _break = false;
static DateTime _now;
static int _crons_alive = 0;
static CronAttribute[] Init(IEnumerable<Assembly> assemblies, Logger logger, bool logEvent)
{
@ -250,6 +251,7 @@ namespace Apewer
}
// 启动线程。
_crons_alive = _crons.Length;
Console.CancelKeyPress += (s, e) =>
{
_break = true;
@ -261,22 +263,64 @@ namespace Apewer
// 监视退出状态。
while (true)
{
Thread.Sleep(300);
Thread.Sleep(100);
_now = DateTime.Now;
var alive = 0;
for (var i = 0; i < _crons.Length; i++) if (_crons[i]._alive) alive += 1;
if (alive < 1) break;
_crons_alive = alive;
}
logger.Text(nameof(CronAttribute), "所有 Cron 已结束。");
}
}
/// <summary>打断正在执行的 Cron。</summary>
public static void Abort()
{
var crons = _crons;
if (crons != null)
{
foreach (var cron in crons)
{
if (cron == null) continue;
try { cron._thread.Abort(); } catch { }
}
}
}
/// <summary>打断 Cron 循环,不打断正在执行的 Cron。</summary>
public static void Break()
{
_break = true;
}
/// <summary>打断 Cron 循环并等待 Cron 执行结束。等待指定的时间后打断正在执行的 Cron。</summary>
/// <param name="timeout">强制打断前的等待毫秒数,指定为负数时将无限等待。</param>
public static void Break(int timeout = 20000)
{
_break = true;
const int interval = 100;
if (timeout < 0)
{
while (_crons_alive > 0) Thread.Sleep(interval);
return;
}
else
{
if (timeout > 0)
{
var remains = timeout;
while (remains > 0 && _crons_alive > 0)
{
Thread.Sleep(interval);
remains -= interval;
}
}
Abort();
}
}
/// <summary>获取状态,指示打断 Cron 循环。</summary>
public static bool Breaking { get => _break; }

Loading…
Cancel
Save