我正在创建自己的调度程序,它将在我的一个WPF应用程序中使用。
这是代码。
// Interface for a scheduled task.
public interface IScheduledTask
{
// Name of a task.
string Name { get; }
// Indicates whether should be task executed or not.
bool ShouldBeExecuted { get; }
// Executes task.
void Execute();
}
// Template for a scheduled task.
public abstract class PeriodicScheduledTask : IScheduledTask
{
// Name of a task.
public string Name { get; private set; }
// Next task's execute-time.
private DateTime NextRunDate { get; set; }
// How often execute?
private TimeSpan Interval { get; set; }
// Indicates whether task should be executed or not. Read-only property.
public bool ShouldBeExecuted
{
get
{
return NextRunDate < DateTime.Now;
}
}
public PeriodicScheduledTask(int periodInterval, string name)
{
Interval = TimeSpan.FromSeconds(periodInterval);
NextRunDate = DateTime.Now + Interval;
Name = name;
}
// Executes task.
public void Execute()
{
NextRunDate = NextRunDate.AddMilliseconds(Interval.TotalMilliseconds);
Task.Factory.StartNew(new Action(() => ExecuteInternal()));
}
// What should task do?
protected abstract void ExecuteInternal();
}
// Schedules and executes tasks.
public class Scheduler
{
// List of all scheduled tasks.
private List<IScheduledTask> Tasks { get; set; }
... some Scheduler logic ...
}
现在,我需要为调度程序选择正确的.net计时器。内部应该有订阅的事件tick / elapsed,它通过任务列表并检查是否应该执行某个任务,然后通过调用task.Execute()
来执行它。
更多信息。我需要在1秒内设置定时器间隔,因为我创建的某些任务需要每秒,两次或更多次执行。
我是否需要在新线程上运行计时器以启用用户在表单上的操作?哪个计时器最适合此计划程序?
答案 0 :(得分:1)
我会使用System.Timers.Timer。来自MSDN documentation:
基于服务器的Timer设计用于a中的工作线程 多线程环境。服务器计时器可以在线程之间移动 处理凸起的Elapsed事件,导致更准确 Windows计时器按时提升事件。
我认为您不必在单独的线程上手动启动它。我从来没有从UI中窃取CPU时间,尽管我的开发主要是在Winforms中,而不是WPF。
答案 1 :(得分:0)
您应该使用DispatcherTimer,因为它集成到创建它的同一个线程上的调度程序队列中(在您的情况下是UI线程):
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += new EventHandler(timer_Tick);
timer.Start();