Может появиться необходимость автоматического запуска стратегии в указанное время в течении дня, поэтому здесь мы рассмотрим самый простой способ реализации автозапуска стратегии по времени.
Ключевым элементом будет таймер, который будут периодически сверять текущее время и выбранное время старта стратегии, объявляем переменную таймера в классе окна:
public partial class MainWindow : Window
{
private System.Threading.Timer _timer;
...
Объявим переменную типа DateTime, которая будет хранить время, когда нужно запустить стратегию, объявляем на том же уровне что и таймер:
public partial class MainWindow : Window
{
private System.Threading.Timer _timer;
private DateTime _dtSelected;
...
И для удобства создадим на форме (окне) элемент выбора времени:
<xctk:TimePicker Height="20" Width="100" x:Name="tpTime" />
в данном случае взят TimePicker из Xceed.Wpf.Toolkit:
xmlns:xctk="clr-namespace:Xceed.Wpf.Toolkit;assembly=Xceed.Wpf.Toolkit"
заметим, что этот контрол имеет имя tpTime, далее мы будем обращаться к нему по этому имени.
Теперь нам надо создать экземпляр этого таймера, указать ему метод, который будет периодически вызываться, и запустить таймер, для этого создадим кнопку, и укажем действие по нажатию:
private void AutoStartStrategyClick(object sender, RoutedEventArgs e)
{
if (tpTime.Value == null)
{
MessageBox.Show("Время запуска стратегии не выбрано");
return;
}
_dtSelected = tpTime.Value.Value;
_timer = new Timer(CheckStatus, null, 0, 1000);
}
И реализуем метод CheckStatus:
public void CheckStatus(Object stateInfo)
{
var dtNow = DateTime.Now;
if (_dtSelected.TimeOfDay < dtNow.TimeOfDay)
{
_firstStrategy.Start();
}
}
Это минимум и немного больше, для того чтобы создать автоматический запуск стратегии по времени.
Есть специальные библиотеки, которые предоставляют большие возможности по работе с расписанием, например Quartz. Quartz позволяет создавать разного рода расписания, достаточно удобно и просто, если разобраться в его работе.
Comments (2)
Login or Create account, Log in or register to leave a comment
Спасибо, Иван! Полезная вещь.
Правильно ли я понимаю, что теперь, чтобы остановить стратегию по расписанию, нужно в метод
public void CheckStatus(Object stateInfo) { var dtNow = DateTime.Now; if (_dtSelected.TimeOfDay < dtNow.TimeOfDay) { _firstStrategy.Start(); }}
прописать условие уже для _firstStrategy.Stop(); ? Можно же использовать этот же таймер?
И еще, собственно, главный вопрос: если возникнет необходимость, при работе приложения, в автоматическом включении и выключении стратегии более одного раза (без моего участия), допустим чтобы она часик покурила, а потом снова включилась, то можно ли просто внести расписание в код? Правильно ли будет создать несколько констант вместо _dtSelected, запустить таймер (пусть даже без использования кнопок) и расставить условия на включение и выключение? У меня пока нет тямы, чтобы разбираться с Quartz, поэтому сейчас чем проще, тем для меня понятнее. Я пока еще в одной переменной путаюсь, а библиотеки для меня пока что где-то в 4-м измерении 😀