我的程序中有一个执行很长时间的方法。所以,我希望它在晚上执行,或者在用户没有使用该应用程序时执行。
用户将在文本框中输入时间和日期,我将该值保存在数据库中。
假设用户输入27th December 2012, midnight.
我希望Example()
方法在该确切时间开始执行。
有没有办法对此进行编程?
答案 0 :(得分:2)
有各种选择,你找到了什么?
例如,您可以通过Windows任务计划程序运行任务,或运行定期检查启动特定任务的时间是否已接近的服务,如果是,则执行此任务。
答案 1 :(得分:2)
您应该查看现有的库作业调度,例如Quartz。特别是如果你打算进行递归工作。
Quartz可以嵌入到现有应用程序中,也可以作为独立应用程序单独运行。
答案 2 :(得分:0)
创建System.Timers.Timer对象。计算用户输入的时间减去当前时间(以毫秒为单位)。将该方法作为其Elapsed事件处理程序传递给计时器的构造函数。
答案 3 :(得分:0)
试试这个:
if (DateTime.Now == your time)
{
// do your process
}
答案 4 :(得分:0)
这里有几个选项 - 您可以拥有一个服务来轮询数据库以执行工作,以及何时执行Example方法。 您可以以编程方式创建一个Windows计划任务,这样您就不需要轮询。
然而,MVC中没有任何方法可以提前获得定时回叫。
答案 5 :(得分:0)
您可以在延迟一段时间后使用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)
每天执行方法。
答案 6 :(得分:0)
正如@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外部的单独线程非常重要。