简单的定时任务不需要引入复杂的三方库来实现,每个插件都可以建档设定独立的定时器 关键字: HttpClient, IHttp
[[toc]]
定时器 OnTimer
通常情况下我们会在插件的Runner.OnStart里增加定时任务
public void OnStart()
{
Builder.AutoMaper();
IPlugin.AddOnTimerQueue(OnTimer, 3000);
var targetTime = DateTime.Parse(DateTime.Now.AddDays(1).ToString("yyyy-MM-dd")) - DateTime.Now;
IPlugin.AddOnTimerQueue(OnTimer, TimeSpan.FromDays(1), targetTime);
Console.WriteLine("插件被启动!");
}
public void OnTimer()
{
Console.WriteLine("This is Plugin Demo OnTimer ");
}
AddOnTimerQueue 的结构如下
/// <param name="onTimerDelegate">代理函数</param>
/// <param name="interval">循环间隔毫秒数</param>
void AddOnTimerQueue(
PluginOnTimerDelegate onTimerDelegate,
int interval = 1000);
/// <param name="interval">定时间隔</param>
/// <param name="delay">延迟</param>
void AddOnTimerQueue(
PluginOnTimerDelegate onTimerDelegate,
TimeSpan interval,
TimeSpan delayms);
删除定时器
//从default队列中删除OnTimer代理
IPlugin.RemoveOnTimerQueue(OnTimer);
补充说明
::: warning 一个插件只能创建一个主定时任务,如果重复创建会被覆盖。如果需要多个定时任务,可以在主定时任务中自行实现。 ::: ::: warning 插件重启会自动清理定时器 :::
线程工具 ITask
ITask的是为了统一插件内部的线程管理,优化插件重载后内存的回收效果
创建线程
ITask.Create((self, token) =>
{
//self为当前的Task
Console.WriteLine(self.GetHashCode());
Console.WriteLine("我要创建一个任务");
for (var i = 0; i < 1000; i++)
{
Console.WriteLine("{0} ==> {1},token.IsCancellationRequested {2}", this.GetHashCode(), i, token.IsCancellationRequested);
if (token.IsCancellationRequested) return;
Thread.Sleep(1000);
//10秒后任务取消
if(i ==10) {
token.Cancel();
}
}
}).Start();
ITask.Create 的函数结构
Task Create(Action<Task,CancellationTokenSource> action)
允许传递一个带CancellationTokenSource参数的方法
::: warning 循环方法内加 if (token.IsCancellationRequested) return; 是为了确保线程退出时按照逻辑退出线程,是必不可缺的一部分! :::
线程的结束
除了 token.Cancel(); 插件重载后会自动取消任务,通过 token.IsCancellationRequested 判断退出