← Zurück

Автоматический запуск стратегии по указанному времени

Может появиться необходимость автоматического запуска стратегии в указанное время в течении дня, поэтому здесь мы рассмотрим самый простой способ реализации автозапуска стратегии по времени.

Ключевым элементом будет таймер, который будут периодически сверять текущее время и выбранное время старта стратегии, объявляем переменную таймера в классе окна:


    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 позволяет создавать разного рода расписания, достаточно удобно и просто, если разобраться в его работе.

War dieses Thema hilfreich?

Thema teilen

Kommentare (2)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

shos
shos

Спасибо, Иван! Полезная вещь.

Правильно ли я понимаю, что теперь, чтобы остановить стратегию по расписанию, нужно в метод

public void CheckStatus(Object stateInfo) { var dtNow = DateTime.Now; if (_dtSelected.TimeOfDay < dtNow.TimeOfDay) { _firstStrategy.Start(); }}

прописать условие уже для _firstStrategy.Stop(); ? Можно же использовать этот же таймер?

И еще, собственно, главный вопрос: если возникнет необходимость, при работе приложения, в автоматическом включении и выключении стратегии более одного раза (без моего участия), допустим чтобы она часик покурила, а потом снова включилась, то можно ли просто внести расписание в код? Правильно ли будет создать несколько констант вместо _dtSelected, запустить таймер (пусть даже без использования кнопок) и расставить условия на включение и выключение? У меня пока нет тямы, чтобы разбираться с Quartz, поэтому сейчас чем проще, тем для меня понятнее. Я пока еще в одной переменной путаюсь, а библиотеки для меня пока что где-то в 4-м измерении 😀

IvanB
IvanB Autor

shos: Спасибо, Иван! Полезная вещь.

Правильно ли я понимаю, что теперь, чтобы остановить стратегию по расписанию, нужно в метод

public void CheckStatus(Object stateInfo) { var dtNow = DateTime.Now; if (_dtSelected.TimeOfDay < dtNow.TimeOfDay) { _firstStrategy.Start(); }}

прописать условие уже для _firstStrategy.Stop(); ? Можно же использовать этот же таймер? Да, все верно.

shos: И еще, собственно, главный вопрос: если возникнет необходимость, при работе приложения, в автоматическом включении и выключении стратегии более одного раза (без моего участия), допустим чтобы она часик покурила, а потом снова включилась, то можно ли просто внести расписание в код? Правильно ли будет создать несколько констант вместо _dtSelected, запустить таймер (пусть даже без использования кнопок) и расставить условия на включение и выключение? У меня пока нет тямы, чтобы разбираться с Quartz, поэтому сейчас чем проще, тем для меня понятнее. Я пока еще в одной переменной путаюсь, а библиотеки для меня пока что где-то в 4-м измерении 😀 Да, верно понимаете. Создаете несколько переменных по подобию _dtSelected, например: _dtStartFirstSelected, _dtStopFirstSelected, _dtStartSecondSelected, _dtStopSecondSelected (в данном случае, судя по именам переменных, предполагается два рабочих интревала стратегии в течении дня), и соответственно задать условия и действия в методе CheckStatus.