编程方法执行的开始时间 - 此时开始执行的方法

时间:2012-12-24 15:49:23

标签: c# asp.net-mvc

我的程序中有一个执行很长时间的方法。所以,我希望它在晚上执行,或者在用户没有使用该应用程序时执行。

用户将在文本框中输入时间和日期,我将该值保存在数据库中。

假设用户输入27th December 2012, midnight.

我希望Example()方法在该确切时间开始执行。

有没有办法对此进行编程?

7 个答案:

答案 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外部的单独线程非常重要。