C# 如何在特定时间触发事件?

7
我正在开发一个程序,需要在一天的某个特定时间删除文件夹(然后重新实例化它),这个时间将由用户给出。
这个时间很可能是在晚上,因为这时候没有人访问该文件夹(工作时间已过)。有没有办法在特定的时间触发这个事件?
我知道计时器,但是否有更简单的方法来做到这一点,而不需要一个滴答声并检查当前时间?
编辑:也许我没有说明清楚。我想要触发一个方法去做某件事情,而不需要先将其编译成一个独立的可执行文件。这个方法是一个更大类的一部分,实现为Windows服务。所以这个服务持续运行,但在一天的某个特定时间,它应该触发这个函数来删除文件夹。
谢谢。

1
你的程序只需要完成这个任务吗?如果是,为什么不使用任务调度器呢? - devnull
你不能设置一个计时器只在 (now-when).TotalSeconds 的时间间隔内触发吗?这不是你正在寻找的吗? - ANeves
6个回答

9

打破常规思维。

这种工作不需要编写代码 - 使用 定时任务(Task Scheduler),它们在Windows系统中已有很长时间了。您可以从此启动您的程序。

更新: (根据问题的最新更新)

如果您需要从一个已经运行的服务中触发一个方法,请使用计时器并将DateTime.Now与目标时间进行比较测试。


谢谢,好主意。我还发现了这个链接,可能对其他人有帮助: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/8240ca9c-a70e-4827-b5ff-c576d632862c - Alex

8

如果您想在代码中实现此操作,则需要使用Timer类并触发Elapsed事件。

A. 计算距离第一次运行还剩下的时间。

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.
 }

2

当程序启动时,当计时器被改变时,或者当事件结束时,计算剩余时间(以毫秒为单位)并设置计时器间隔。

  • 程序开始
  • 计时器被改变
  • 事件结束

这需要一个应用程序正在运行。在服务中运行此类定时问题可能更合适。 - citronas
@citro,是的,但那需要与服务进行通信的复杂性和权限。不知道应用程序的其余部分是什么,我选择了最短的路径。 - H H

2

使用Windows计划任务。在那里,您可以指定要执行的文件。


1
一个可能的起点或指南:NCrontab

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接