создание файла каждые 24 часа зависит от таймера - PullRequest
1 голос
/ 03 ноября 2011

Я сделал так ... для выполнения функции резервного копирования (резервного копирования базы данных с использованием mysql) для каждых 24 часов, запланированных на ночь 10 часов

и он также проверит время создания файла (backup.sql) (т. Е.), Если существует какой-либо файл, который не был создан в течение 24 часов, он создаст файл ....., который был выполнен в функции backupdatabase. ..

но он не создавал файл для каждого дня ночью 10 часов ....

Я использовал таймер для создания файла каждый день ночью 10 часов ...

а это мой код ....

public partial class BackupForm : Form
{
 private static System.Timers.Timer _timer;
 private Int32 _hours = 0;
 private Int32 _runAt = 10;

public BackupForm()
{
}
private void BackupForm_Load(object sender, EventArgs e)
{
  _hours = (24 - (DateTime.Now.Hour + 1)) + _runAt;
  _timer = new Timer {Interval = _hours*60*60*1000};
  _timer.Elapsed += new ElapsedEventHandler(Tick);
  _timer.Start();


}

void Tick(object sender, ElapsedEventArgs e)
{
  string hostname = MainHelper.getServer();
  const string path = @"C:\folder\Access\backupdb\";
  var listfiles = Directory.GetFiles(@"C:\folder\Access\backupdb\", "backup-*.zip").OrderByDescending(File.GetCreationTime).ToList();
  var getfiles = new List<String>();
  var files = listfiles.Select(Path.GetFileName).ToList();
  var dt = DateTime.Now;
  foreach(var file in files)
  {

    var creationtime = File.GetCreationTime(file);
    var diff = DateTime.Now.Subtract(creationtime);
    if(diff.Hours > 24 && diff.Days < 2 && creationtime.Month == dt.Month && creationtime.Year == dt.Year && hostname == "localhost" && _hours == 24)
    {
      backupDatabase();// here, i am doing backup database(creating backup.Zip file) 

    }
    else if (_hours != 24)
    {
      _hours = 24;
    _timer.Interval = _hours * 60 * 60 * 1000;
    }
  }
 }
}

Я не знаю, где я ошибся ...

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

Может ли кто-нибудь помочь с этим ...

любой пример кода будет очень полезен для меня, чтобы вызвать событие в определенное время, включая проверку 24 часа ......

Большое спасибо ... Заранее

Ответы [ 4 ]

2 голосов
/ 03 ноября 2011

В вашем Tick событии похоже, что вам нужно _timer.Stop() в начале этого события, а затем _timer.Start() в конце, чтобы сбросить таймер.

Edit:

Шаг 1: в вашем BackupForm_Load событии вы можете рассчитать следующее событие в 10:00, выполнив следующее:

var now = DateTime.Now;
var today = now.Date;
var tenAm = today.AddHours(10).AddDays(now.Hour >= 10 ? 1 : 0);

TimeSpan ts = tenAm - now;

var timeInMillisecondsTill10Am = ts.Milliseconds;

Шаг 2: в вашем Tick вызове события _timer.Stop() в начале события. Затем установите интервал в 24 часа, как показано ниже. И, наконец, вызовите _timer.Start() непосредственно перед самой последней строкой вашего Tick события, чтобы сбросить таймер:

var twentyFourHoursFromNow = TimeSpan.FromHours(24).TotalMilliseconds;
1 голос
/ 03 ноября 2011

Зачем изобретать велосипед.Вы можете использовать планировщик заданий предприятия, подобный этому, который можно найти по адресу Quartz.net .Пусть Quartz.net выполнит планирование и уволит работу вовремя.Потратьте свое время на разработку бизнес-логики.

0 голосов
/ 21 ноября 2011

Это действительно похоже на задачу для языка сценариев, а не для приложения Forms, но ... вы действительно можете упростить свой код, если используете библиотеку Reactive Extensions от Microsoft.

Observable.Interval(TimeSpan.FromHours(24)).Subscribe(x => DoBackup());
0 голосов
/ 03 ноября 2011

Ниже

    void Tick(object sender, ElapsedEventArgs e)
{

добавить _timer.Stop();

и до конца метода (до "}") добавить _timer.Start();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...