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

您当前正在浏览的是本站SEO版网页

请点击确认

马上提升浏览体验

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

简单的定时任务不需要引入复杂的三方库来实现,每个插件都可以建档设定独立的定时器 关键字: HttpClient, IHttp

定时器 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);

补充说明

线程工具 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参数的方法

线程的结束

除了 token.Cancel(); 插件重载后会自动取消任务,通过 token.IsCancellationRequested 判断退出