XIKEW.COM - 实用教程 - 内置的定时器与线程工具 - 实用教程,HttpClient, IHttp - 简单的定时任务不需要引入复杂的三方库来实现,每个插件都可以建档设定独立的定时器

内置的定时器与线程工具
LINKCORE NETCORE 框架 9/8/2024 10:41:59 PM 阅读:0

简单的定时任务不需要引入复杂的三方库来实现,每个插件都可以建档设定独立的定时器 关键字: 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 判断退出