代码之家  ›  专栏  ›  技术社区  ›  Alex

C我如何在一天中的特定时间触发事件?

  •  4
  • Alex  · 技术社区  · 15 年前

    我正在开发一个程序,需要在一天中的某个小时删除一个文件夹(然后重新实例化它),这个小时由用户给出。

    这个时间很可能是在晚上,因为那时没有人访问文件夹(它不在工作时间内)。有没有办法在那个特定的时间触发那个事件?

    我知道计时器,但是如果没有一个计时器来计时和检查时间,有没有更简单的方法可以做到这一点?

    编辑 可能我不够具体。我想触发一个方法来做一些事情,而不必首先在单独的可执行文件中编译它。此方法是作为Windows服务实现的更大类的一部分。所以这个服务持续运行,但是在一天中的某个时间,它应该触发这个函数来删除文件夹。

    谢谢。

    6 回复  |  直到 12 年前
        1
  •  7
  •   Oded    15 年前

    跳出框框思考。

    不需要对这种工作使用进行编码 Scheduled Tasks 他们在窗户里呆了很长时间。你可以从这个开始你的计划。

    更新 :(更新问题后)

    如果需要从 运行 服务,使用计时器并测试 DateTime.Now 与你的目标时间相反。

        2
  •  4
  •   CathalMF    12 年前

    如果您想在代码中这样做,您需要使用Timer类并触发Elapsed事件。

    计算到第一次运行时的剩余时间。

    TimeSpan day = new TimeSpan(24, 00, 00);    // 24 hours in a day.
    TimeSpan now = TimeSpan.Parse(DateTime.Now.ToString("HH:mm"));     // The current time in 24 hour format
    TimeSpan activationTime = new TimeSpan(4,0,0);    // 4 AM
    
    TimeSpan timeLeftUntilFirstRun = ((day - now) + activationTime);
    if(timeLeftUntilFirstRun.TotalHours > 24)
        timeLeftUntilFirstRun -= new TimeSpan(24,0,0);    // Deducts a day from the schedule so it will run today.
    

    b.设置计时器事件。

    Timer execute = new Timer();
    execute.Interval = timeLeftUntilFirstRun.TotalMilliseconds;
    execute.Elapsed += ElapsedEventHandler(doStuff);    // Event to do your tasks.
    execute.Start();
    

    c.设置该方法执行您想要执行的操作。

     public void doStuff(object sender, ElapsedEventArgs e)
     { 
            // Do your stuff and recalculate the timer interval and reset the Timer.
     }
    
        3
  •  2
  •   Henk Holterman    15 年前

    什么时候?

    • 程序启动
    • 计时器已更改
    • 活动已经结束

    计算剩余时间(毫秒)并设置计时器间隔。

        4
  •  2
  •   citronas    15 年前

    使用Windows计划程序。在这里,您可以指定在何时执行哪个文件。

        5
  •  1
  •   markcial    15 年前

    可能的开始或指导方针: NCrontab

        6
  •  1
  •   Dean Harding    15 年前

    这个 programmatic interface for Scheduled Task 是基于COM的,所以从.NET使用它应该相对容易(尽管我从未尝试过)。