【问题标题】:creating file for every 24 hours depends on the timer每 24 小时创建文件取决于计时器
【发布时间】:2011-11-03 11:20:44
【问题描述】:

我已经这样做了...用于在晚上10点每24小时执行一次备份(使用mysql备份数据库)功能

它还会检查文件创建时间(backup.sql)(即),如果有任何文件在 24 小时内未创建,它将创建文件.....这是在备份数据库功能中完成的。 ..

但它并没有为每天晚上 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 小时......

非常感谢...提前

【问题讨论】:

    标签: c# .net windows winforms timer


    【解决方案1】:

    在您的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;
    

    【讨论】:

    • 我需要在这个事件之前放置 _timer.Stop() 函数吗 _timer.Elapsed += new ElapsedEventHandler(Tick); ??????
    • @rockyashkumar 首先在 BackupForm_Load 事件中计算从 DateTime.Now 到 10 点的时间。然后,当计时器关闭并运行您的 Tick 事件时,_timer.Stop() 在事件开始时,将计时器设置为在 24 小时内关闭,然后在您关闭之前 } 在事件调用结束时关闭 _timer.Start () 重置计时器。
    • 非常感谢.....但是请您说明“var二十四小时FromNow”将如何与tick事件相关......您能否在tick事件中显示代码......我在哪里必须放置那条线....
    • 我需要将时间间隔设置为从现在开始的 24 小时...在滴答事件中 ....
    • 知道了,但我需要检查 if 条件我如何检查我是否检查我是否像上面那样指定...
    【解决方案2】:

    为什么要重新发明轮子。您可以使用像 Quartz.net 这样的企业作业调度程序。让 Quartz.net 处理调度并按时触发作业。将您的优质时间投入到开发业务逻辑上。

    【讨论】:

    • +1 表示不重新发明东西。如果 Quartz.net 对您的需求似乎很复杂,请查看 NCron 或 Windows 调度程序怎么样?
    • NCron 看起来是一个更好的选择。在我看来 Quartz.Net 是 Java 版本的哑端口。
    【解决方案3】:

    下面

        void Tick(object sender, ElapsedEventArgs e)
    {
    

    添加_timer.Stop();

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

    【讨论】:

      【解决方案4】:

      这看起来确实像是脚本语言而不是表单应用程序的任务,但是...如果您使用 Microsoft 的 Reactive Extensions 库,您可以真正简化您的代码。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-14
        • 1970-01-01
        • 1970-01-01
        • 2011-05-31
        • 1970-01-01
        • 2020-11-01
        相关资源
        最近更新 更多