在使用计时器执行函数之前等待 X 小时不起作用

本文关键字:等待 小时 不起作用 函数 计时器 执行 | 更新日期: 2023-09-27 17:56:46

我想在用 C# 执行一些代码之前等待 x 小时。 我认为使用计时器是个好主意。(使用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,但是当我调试它时,main 函数在 timer.start() 之后结束。

你在这里看到任何问题吗?或者你能建议一个除了thread.sleep或await Task.Delay()之外的替代方案吗?

在使用计时器执行函数之前等待 X 小时不起作用

一旦您的 Main 函数退出,您的进程就会结束,任何后台线程(包括计时器)都会结束。

您需要使用 Thread.Sleep()Console.ReadKey()或任何看起来合适的方式保持主线程的活动。

或者,如果不想使进程保持活动状态,则可以向 Windows 注册计划任务,使其在一小时后运行,然后结束。

这里有两个问题。首先,当所有前台线程都运行完毕时,可执行文件将退出。唯一的前景线程是经过Main(),因此它将退出。

第二个是你没有timer存储在任何地方。即使另一个线程使可执行文件保持运行,timer也可能在timer.Start()返回后立即进行垃圾回收,当然在Main()退出后。

使用 thread.sleep 似乎不对

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

更一般地说,我认为我希望这是一个计划任务或服务。特别是,如果我想在完成某事之前等待数小时,我经常希望它在重新启动后幸存下来。

签出 Quartz.Net,这是计划任务。