簡體   English   中英

每24小時創建文件取決於計時器

[英]creating file for every 24 hours depends on the timer

我已經做過這樣的事情...用於在晚上10點安排的每24小時執行一次backup(使用mysql的備份數據庫)功能

它還將檢查文件創建時間(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;
    }
  }
 }
}

我不知道我錯在哪里......

我的目標是每天在給定的時間創建文件(執行backupdatabase功能),此外還要檢查文件創建時間(24小時內)

任何人都會對此有所幫助..

任何示例代碼對我在特定時間舉辦活動非常有幫助,包括24小時檢查......

提前謝謝了

在您Tick的事件,它看起來像你需要_timer.Stop()在該事件的開始,然后_timer.Start()在結束復位定時器。

編輯:

步驟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小時,如下所示。 最后,在Tick事件的最后一行之前調用_timer.Start()以重置計時器:

var twentyFourHoursFromNow = TimeSpan.FromHours(24).TotalMilliseconds;

為什么重新發明輪子。 您可以使用Quartz.net上的企業作業調度程序。 讓Quartz.net處理計划並按時觸發作業。 在開發業務邏輯上投入寶貴的時間。

下面

    void Tick(object sender, ElapsedEventArgs e)
{

add _timer.Stop();

在方法結束之前(在它的“}”之前)添加_timer.Start();

這對於腳本語言而不是Forms應用程序來說似乎是一項任務,但是......如果您使用Microsoft的Reactive Extensions庫,則可以真正簡化代碼。

Observable.Interval(TimeSpan.FromHours(24)).Subscribe(x => DoBackup());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM