2012-03-23 4 views
0

Я создаю свой собственный планировщик, который будет использоваться в одном из моих приложений 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 для планировщика. Внутри должен быть подписан флажок/истекает событие, которое проходит через список задач и проверяет, должна ли выполняться какая-либо задача, а затем выполнить ее, вызвав task.Execute().

Дополнительная информация. Мне нужен интервал таймера, установленный на 1 секунду, потому что некоторые задачи, которые я создаю, должны выполняться каждую секунду, два или более.

Нужно ли запускать таймер на новый поток, чтобы активировать действия пользователя по форме? Какой таймер наиболее подходит для этого Планировщика?

ответ

1

Я бы использовал System.Timers.Timer. Из MSDN documentation:

Серверный Таймер предназначен для использования с рабочими потоками в многопоточной среде. Таймеры сервера могут перемещаться между потоками до обрабатывать поднятое событие Elapsed, что приводит к большей точности, чем Таймеры Windows, которые поднимают событие вовремя.

Я не думаю, что вам придется вручную запускать его в отдельной теме. Я никогда не видел, чтобы он крал процессорное время от пользовательского интерфейса, хотя мое развитие было в основном в Winforms, а не в WPF.

+0

Честно говоря, моя первая мысль была DispatcherTimer, поскольку моя приложение основано на WPF. Если в другом потоке не требуется таймер запуска, какая разница между System.Times.Timer и DispatcherTimer, выполняющим taks в новом потоке? –

+0

@ Андрей, я, возможно, неправильно понял ваш вопрос. Похоже, вы обеспокоены реактивностью пользовательского интерфейса, когда этот таймер работает. Преимущество System.Timers.Timer в этом отношении состоит в том, что он предназначен для использования в многопоточной среде. Если вы запустите его в отдельном потоке, он все равно должен срабатывать вовремя, независимо от того, что происходит в пользовательском интерфейсе. Я не использовал DispatchTimer, поэтому я действительно не могу говорить об этом. Это может быть лучше для того, что вам нужно, это, вероятно, стоит дальнейших исследований. –

0

Вы должны использовать DispatcherTimer, как она интегрирована в диспетчерском очереди в том же потоке, что она создана (в вашем случае нить UI):

DispatcherTimer timer = new DispatcherTimer(); 
timer.Interval = TimeSpan.FromSeconds(1); 
timer.Tick += new EventHandler(timer_Tick); 
timer.Start(); 
+0

Хорошо, я пробовал, но по какой-то причине это не работает. Поэтому я только изменил DispatcherTimer для Timers.Timer и не работает нормально. Это тайна. –

+0

@ А что конкретно не работает? Какую ошибку вы получаете? – Slugart

+0

Вот и все. Ошибок и исключений нет. Таймер просто не отмечает, что он работает в соответствии с свойством IsEnabled. Я не понимаю, почему это не работает. –

Смежные вопросы