Как сделать так, чтобы код выполнялся с периодичностью, допустим каждые 3 дня
У меня есть код, который выполняется в определенное время.
private void timer1_Tick(object sender, EventArgs e)
{
string date = Properties.Settings.Default.frequency;
//тут хранится значение ДЕНЬ:ЧАС, то есть Периодичность:ВремяЗапуска
string[] dates = date.Split(new char[] { ':' });
try
{
int hour = Convert.ToInt32(dates[1]);
if (hour == DateTime.Now.Hour)
{
Backup.Start(); //тут вызывается код который считывает файлы
//и закачивает их на сервер, так что выполнять это много раз нет смысла
}
}
catch
{
MessageBox.Show("Ошибка", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
Properties.Settings.Default.frequency = "00:00";
}
}
Мне нужно как-то сделать, чтобы он в любое время, допустим в первые 15 минут часа выполнился и ждал следующего дня. Тик у меня стоит 5 минут, не думаю что если я установлю минутный тик, то хорошо скажется на производительности. Но я в этом не разбираюсь, просто догадки. Я могу установить минутный тик и точное время, но я боюсь, что он может пропустить этот минутный миг) Будет неприятно. Также важно чтобы я мог установить периодичность. Например раз в 3 дня. Количество дней будет указано в переменной.
Ответы (1 шт):
Не ответ на ваш вопрос, но подсказка. Так как вы показали таймер, то и по таймеру.
Вот пример, как записать класс с данными на диск в XML файл при выходе из программы и прочитать его при запуске.
timer1.Stop() не забудьте только вызвать при выходе из программы, а то могут быть сюрпризы в виде выполнения кода даже когда программа уже закрыта (на самом деле не закрыта, а висит в памяти).
Для обучения, немного доработал ваш код. Сейчас пока идет бэкап, ваше приложение будет "висеть", это легко исправить с помощью асинхронности.
При таком условии выполнения, поставьте таймер раз в час. Иначе пока часы в ваших данных равны часам на часах, код будет выполняться, как вы написали, раз в 5 минут.
bool isTimerRunning = false;
private async void timer1_Tick(object sender, EventArgs e)
{
if (isTimerRunning) return; // защита от повторного запуска
isTimerRunning = true;
string date = Properties.Settings.Default.frequency;
if (int.TryParse(date.Split(":")[1], out int hour) && hour == DateTime.Now.Hour)
{
// label1.Text = "Выполняется резервное копирование";
try
{
await Task.Run(() => Backup.Start());
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
Properties.Settings.Default.frequency = "00:00";
}
// label1.Text = "Резервное копирование закончилось";
}
isTimerRunning = false;
}
async/await - очень мощная штука, почитайте про это. И заведите StatusStrip в интерфейсе, поместите туда Label, пишите туда что-то полезное для пользователя о работе приложения.
Чтобы улучшить планировщик на раз в несколько дней, при успешном запуске вам надо сохранять дату последнего запуска, и отсчитывать от нее дни.