Я создаю свой собственный планировщик, который будет использоваться в одном из моих приложений 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 секунду, потому что некоторые задачи, которые я создаю, должны выполняться каждую секунду, два или более.
Нужно ли запускать таймер на новый поток, чтобы активировать действия пользователя по форме? Какой таймер наиболее подходит для этого Планировщика?
Честно говоря, моя первая мысль была DispatcherTimer, поскольку моя приложение основано на WPF. Если в другом потоке не требуется таймер запуска, какая разница между System.Times.Timer и DispatcherTimer, выполняющим taks в новом потоке? –
@ Андрей, я, возможно, неправильно понял ваш вопрос. Похоже, вы обеспокоены реактивностью пользовательского интерфейса, когда этот таймер работает. Преимущество System.Timers.Timer в этом отношении состоит в том, что он предназначен для использования в многопоточной среде. Если вы запустите его в отдельном потоке, он все равно должен срабатывать вовремя, независимо от того, что происходит в пользовательском интерфейсе. Я не использовал DispatchTimer, поэтому я действительно не могу говорить об этом. Это может быть лучше для того, что вам нужно, это, вероятно, стоит дальнейших исследований. –