编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

NETCore中实现一个轻量无负担的极简任务调度ScheduleTask

wxchong 2024-07-05 01:53:44 开源技术 15 ℃ 0 评论

在.NET Core中实现一个轻量且极简的任务调度器(ScheduleTask)可以是一个有趣且实用的任务。以下是一个简单的例子,展示如何创建一个能够按固定时间间隔执行任务的基础调度器。

首先,我们需要定义一个任务接口,这样我们可以为调度器提供不同的任务实现:

csharppublic interface IScheduledTask
{
    void Execute();
}

然后,我们可以创建一个简单的任务调度器类,它使用一个定时器(Timer)来定期执行任务:

csharpusing System;
using System.Threading;
using System.Threading.Tasks;

public class TaskScheduler
{
    private readonly IScheduledTask _task;
    private readonly TimeSpan _interval;
    private Timer _timer;

    public TaskScheduler(IScheduledTask task, TimeSpan interval)
    {
        _task = task ?? throw new ArgumentNullException(nameof(task));
        _interval = interval;
    }

    public void Start()
    {
        _timer = new Timer(TimerCallback, null, TimeSpan.Zero, _interval);
    }

    public void Stop()
    {
        _timer?.Change(Timeout.Infinite, Timeout.Infinite);
        _timer?.Dispose();
        _timer = null;
    }

    private void TimerCallback(object state)
    {
        _task.Execute();
    }
}

在这个例子中,TaskScheduler 类接受一个实现了 IScheduledTask 接口的对象和一个时间间隔 TimeSpan。当调用 Start 方法时,它会创建一个定时器,该定时器会立即开始执行任务,并且之后每隔指定的时间间隔执行一次。调用 Stop 方法则会停止定时器并释放资源。

现在,我们可以创建一个具体的任务类来实现 IScheduledTask 接口:

csharppublic class SimpleTask : IScheduledTask
{
    public void Execute()
    {
        Console.WriteLine("Task executed at: " + DateTime.Now);
    }
}

最后,我们可以在程序的主入口点(如 Main 方法)中实例化并启动调度器:

csharpclass Program
{
    static void Main(string[] args)
    {
        var task = new SimpleTask();
        var scheduler = new TaskScheduler(task, TimeSpan.FromSeconds(5));
        scheduler.Start();

        // Keep the console open to see the scheduled task executions.
        Console.WriteLine("Press any key to stop the scheduler...");
        Console.ReadKey();

        scheduler.Stop();
    }
}

在这个例子中,我们创建了一个每5秒执行一次的简单任务,并启动了一个调度器来执行它。程序会保持打开状态,以便我们可以看到任务按计划执行。按任意键后,调度器会停止,程序结束。

这只是一个非常基础的例子,实际的任务调度系统可能会涉及更复杂的特性,比如任务的优先级、任务的依赖关系、任务的持久化、异常处理、动态添加或移除任务等。如果需要这些高级特性,你可能需要考虑使用现有的任务调度库,如 Quartz.NET 或 Hangfire。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表