0

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

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

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

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

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

4

7 回答 7

2

您可能应该查看用于作业调度的现有库,例如Quartz。特别是如果您打算进行递归作业。

Quartz 可以嵌入到现有应用程序中,也可以作为独立应用程序单独运行。

于 2012-12-24T16:06:30.097 回答
2

有多种选择,你发现了什么?

例如,您可以通过 Windows 任务计划程序运行任务,或者运行一项服务,定期检查是否已接近启动特定任务的时间,如果是,则执行此操作。

于 2012-12-24T15:54:16.880 回答
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 之外为此初始化一个单独的线程非常重要。

于 2012-12-24T19:27:24.930 回答
0

创建一个 System.Timers.Timer 对象。计算用户输入的时间减去当前时间(以毫秒为单位)。将该时间传递给计时器的构造函数,并将您的方法作为其 Elapsed 事件处理程序。

于 2012-12-24T15:54:21.957 回答
0

尝试这个:

if (DateTime.Now == your time)
{
    // do your process
}
于 2012-12-24T15:55:10.963 回答
0

您在这里有几个选项 - 您可以拥有一个轮询数据库以执行工作的服务,以及何时执行 Example 方法。您可以以编程方式创建一个 Windows 计划任务,这样您就不需要轮询。

然而,MVC 中没有任何方法可以提前这么久获得定时回调。

于 2012-12-24T15:55:49.567 回答
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)每天执行方法的时间段。

于 2012-12-24T15:55:58.767 回答