C# 任务调度 c# TaskScheduler

摘要


在C#中,TaskScheduler是一种非常有用的功能,它允许您在指定的时间或间隔内执行任务。TaskScheduler是一个抽象类,它提供了一个通用的方法来计划和执行任务。您可以使用TaskScheduler来调度多个任务,并且在多线程环境中控制它们的执行。

正文


写一个继承TaskScheduler的类

public class MyScheduler : TaskScheduler{    protected override void QueueTask(Task task)    {        // 将任务排队到线程池中        ThreadPool.QueueUserWorkItem(_ => TryExecuteTask(task));    }
    protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)    {        // 如果当前线程是调度器的线程,则在当前线程内执行任务        if (taskWasPreviouslyQueued && Thread.CurrentThread.IsThreadPoolThread)            return TryExecuteTask(task);
        return false;    }
    protected override IEnumerable<Task> GetScheduledTasks()    {        // 此方法用于调度器的内部追踪,不要求实现        return Enumerable.Empty<Task>();    }}
 

在界面中定时调用​​​​​​​

public partial class Form1 : Form{    public Form1()    {        InitializeComponent();    }
    private async void btnStart_Click(object sender, EventArgs e)    {        // 创建一个任务调度器        var taskScheduler = new MyScheduler();
        // 计划执行任务        var startTime = DateTime.Now.AddSeconds(5); // 5秒后开始执行第一次任务        var interval = TimeSpan.FromSeconds(3); // 每隔3秒重复执行一次任务        ScheduleTask(taskScheduler, () => DoTask("计划任务"), startTime, interval);
    }    private void ScheduleTask(TaskScheduler scheduler, Action action, DateTime startTime, TimeSpan interval)    {        Task.Factory.StartNew(async () =>        {            var delay = startTime - DateTime.Now;            if (delay.TotalMilliseconds > 0)                Thread.Sleep(delay);
            while (true)            {                action();
                // 等待指定的时间间隔                await Task.Delay(interval);            }        }, CancellationToken.None, TaskCreationOptions.LongRunning, scheduler);    }
    private void DoTask(string taskName)    {        this.Invoke(() =>        {            txt.AppendText($"{taskName} executed at: {DateTime.Now}");            txt.AppendText(System.Environment.NewLine);        });
    }
}
 

图片

我们已经创建了一个自定义的任务调度器 MyScheduler,可以执行预定的任务。通过调用 ScheduleTask`方法,我们将任务添加到调度器中。在这个例子中,我们将在5秒后开始执行任务,并且每隔3秒重复执行一次。

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值