在C#中,使用TaskScheduler
类可以轻松地安排和执行任务。要实现任务的动态添加,你可以创建一个自定义的TaskScheduler
类,该类继承自TaskScheduler
并重写QueueTask
方法。这样,你可以在运行时根据需要动态地添加任务。
以下是一个简单的示例,展示了如何创建一个自定义的TaskScheduler
类并动态添加任务:
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
class CustomTaskScheduler : TaskScheduler
{
private readonly ConcurrentQueue<Task> _tasks = new ConcurrentQueue<Task>();
protected override IEnumerable<Task> GetScheduledTasks()
{
return _tasks;
}
protected override void QueueTask(Task task)
{
_tasks.Enqueue(task);
base.QueueTask(task);
}
public void AddTask(Action action, TimeSpan delay)
{
var task = new Task(action);
task.Delay(delay);
AddTask(task);
}
}
class Program
{
static void Main(string[] args)
{
var customTaskScheduler = new CustomTaskScheduler();
// 动态添加任务
customTaskScheduler.AddTask(() => Console.WriteLine("Task 1 executed at: " + DateTime.Now), TimeSpan.FromSeconds(2));
customTaskScheduler.AddTask(() => Console.WriteLine("Task 2 executed at: " + DateTime.Now), TimeSpan.FromSeconds(4));
// 等待所有任务完成
Task.WaitAll(customTaskScheduler.GetScheduledTasks().ToArray());
}
}
在这个示例中,我们创建了一个名为CustomTaskScheduler
的自定义TaskScheduler
类。这个类使用ConcurrentQueue<Task>
来存储计划任务。AddTask
方法接受一个Action
和一个TimeSpan
延迟,然后创建一个新的Task
实例,将其添加到队列中,并调用基类的QueueTask
方法来安排任务。
在Main
方法中,我们创建了一个CustomTaskScheduler
实例,并使用AddTask
方法动态添加了两个任务。这些任务将在指定的延迟后执行。最后,我们使用Task.WaitAll
等待所有任务完成。