在使用计时器执行功能之前等待 x 小时不起作用

waiting for x hours before executing a function using timer does not work

我想等待 x 小时才能在 C# 中执行某些代码。我认为使用计时器是个好主意。 (使用 thread.sleep 似乎不对)。但它就是行不通。我正在使用以下代码:

static void Main(string[] args)
{
    System.Timers.Timer timer = new System.Timers.Timer();
    timer.Interval = x * 3600000;
    timer.Enabled = true;
    timer.Elapsed += (o, e) => SomeFunction(username);
    timer.AutoReset = true;
    timer.Start();
}

这段代码应该等待 x 小时然后执行 SomeFunction 但是当我调试它时,主函数在 timer.start() 之后结束。

你看到这里有什么问题吗?或者你能建议除 thread.sleep 或 await Task.Delay() 之外的替代方案吗?

一旦您的 Main 函数退出,您的进程以及包括计时器在内的所有后台线程都会结束。

您需要使用 Thread.Sleep()Console.ReadKey() 或任何合适的方法来保持您的主线程处于活动状态。

或者,如果您不想让您的进程保持活动状态,您可以 register a scheduled task with Windows 成为 运行 一个小时后,然后结束。

这里有两个问题。第一个是可执行文件将在所有前台线程完成时退出 运行。唯一的前台线程是通过 Main() 所以它将退出。

第二个是您没有在任何地方存储 timer。即使另一个线程让可执行文件继续运行,timer 也可能在 timer.Start() returns 之后并且肯定在 Main() 退出后有资格进行垃圾收集。

using thread.sleep does not seem right

这通常不是一个好主意,但考虑到你只有一个线程,并且考虑到你必须在一个应用程序中至少有一个前台线程,Thread.Sleep 似乎是完全合理的特殊案例。 Task.Delay 一样多。

更一般地说,我想我更希望它是计划任务或服务。特别是,在我想等待数小时才能完成某些事情的情况下,我经常希望它能够在重启后继续存在。

查看 Quartz.Net 和 this 计划任务。