在使用计时器执行函数之前等待 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()之外的替代方案吗?
一旦您的 Main
函数退出,您的进程就会结束,任何后台线程(包括计时器)都会结束。
您需要使用 Thread.Sleep()
、Console.ReadKey()
或任何看起来合适的方式保持主线程的活动。
或者,如果不想使进程保持活动状态,则可以向 Windows 注册计划任务,使其在一小时后运行,然后结束。
这里有两个问题。首先,当所有前台线程都运行完毕时,可执行文件将退出。唯一的前景线程是经过Main()
,因此它将退出。
第二个是你没有timer
存储在任何地方。即使另一个线程使可执行文件保持运行,timer
也可能在timer.Start()
返回后立即进行垃圾回收,当然在Main()
退出后。
使用 thread.sleep 似乎不对
这通常不是一个好主意,但考虑到无论如何你只有一个线程,并且考虑到你必须在应用程序中至少有一个前台线程,Thread.Sleep
这种特殊情况下似乎是完全合理的。 Task.Delay
一样。
更一般地说,我认为我希望这是一个计划任务或服务。特别是,如果我想在完成某事之前等待数小时,我经常希望它在重新启动后幸存下来。
签出 Quartz.Net,这是计划任务。