每24小时创建一次文件取决于计时器

时间:2011-11-03 11:20:45

标签: c# .net windows winforms timer

我这样做了......用于执行备份(备份数据库使用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 个答案:

答案 0 :(得分:2)

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小时后,我将在下面显示。最后在_timer.Start()事件的最后一行之前调用Tick以重置计时器:

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

答案 1 :(得分:1)

为什么重新发明轮子。您可以使用Quartz.net中找到的企业作业调度程序。让Quartz.net按时处理调度并解雇作业。投入您的高质量时间来开发业务逻辑。

答案 2 :(得分:0)

下面

    void Tick(object sender, ElapsedEventArgs e)
{

添加_timer.Stop();

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

答案 3 :(得分:0)

这对于脚本语言而不是Forms应用程序来说似乎是一项任务,但是......如果您使用Microsoft的Reactive Extensions库,则可以真正简化代码。

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