我的程序中有一个方法可以执行很长时间。所以,我希望它在晚上执行,或者在用户不使用应用程序的时候执行。
用户将在文本框中输入时间和日期,我将该值保存在数据库中。
假设用户输入27th December 2012, midnight.
我希望该Example()
方法在那个确切的时间开始执行。
有没有办法对此进行编程?
我的程序中有一个方法可以执行很长时间。所以,我希望它在晚上执行,或者在用户不使用应用程序的时候执行。
用户将在文本框中输入时间和日期,我将该值保存在数据库中。
假设用户输入27th December 2012, midnight.
我希望该Example()
方法在那个确切的时间开始执行。
有没有办法对此进行编程?
您可能应该查看用于作业调度的现有库,例如Quartz。特别是如果您打算进行递归作业。
Quartz 可以嵌入到现有应用程序中,也可以作为独立应用程序单独运行。
有多种选择,你发现了什么?
例如,您可以通过 Windows 任务计划程序运行任务,或者运行一项服务,定期检查是否已接近启动特定任务的时间,如果是,则执行此操作。
正如@Ulises 提到的,您可以使用作业调度程序,或者如果可以分离该任务的逻辑,则可以使用 Windows 调度程序。但是,如果您需要在程序中执行此操作,那只是编码问题;首先是主管方法:
static void Supervisor()
{
while (true)
{
DateTime time = ReadTimeFromFile();
if (Math.Abs((DateTime.Now - time).TotalMinutes) <= 1)
{
DeleteTimeFile(); // to indicate task is done
RunTask();
break;
}
Thread.Sleep(TimeSpan.FromSeconds(5));
}
}
然后将目标时间写入文件。在您的程序开始时(或其他适当的地方):
new Task(Supervisor, TaskCreationOptions.LongRunning).Start();
使用 TaskCreationOptions.LongRunning 选项在 ThreadPool 之外为此初始化一个单独的线程非常重要。
创建一个 System.Timers.Timer 对象。计算用户输入的时间减去当前时间(以毫秒为单位)。将该时间传递给计时器的构造函数,并将您的方法作为其 Elapsed 事件处理程序。
尝试这个:
if (DateTime.Now == your time)
{
// do your process
}
您在这里有几个选项 - 您可以拥有一个轮询数据库以执行工作的服务,以及何时执行 Example 方法。您可以以编程方式创建一个 Windows 计划任务,这样您就不需要轮询。
然而,MVC 中没有任何方法可以提前这么久获得定时回调。
您可以在延迟一段时间后使用Threading.Timer启动您的方法:
DateTime date = // when you need method to run
TimeSpan dueTime = date - DateTime.Now;
Timer timer = new Timer(_ => Example(), null, dueTime, new TimeSpan(0));
您可以指定TimeSpan(24, 0, 0)
每天执行方法的时间段。