为调度程序选择正确的计时器

时间:2012-03-23 13:58:35

标签: c# wpf timer scheduler

我正在创建自己的调度程序,它将在我的一个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秒内设置定时器间隔,因为我创建的某些任务需要每秒,两次或更多次执行。

我是否需要在新线程上运行计时器以启用用户在表单上的操作?哪个计时器最适合此计划程序?

2 个答案:

答案 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();