【发布时间】:2015-06-17 16:58:27
【问题描述】:
我想在 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 但是当我调试它时,主函数在 timer.start() 之后结束。
你觉得这里有什么问题吗?或者你能建议除了 thread.sleep 或 await Task.Delay() 的替代方案吗?
【问题讨论】:
-
System.Timers.Timer通常使用后台线程来引发事件,所以它会启动计时器然后继续前进,它不会阻塞。 -
是的,我发现那里有问题。对 timer.Start() 的调用是异步的。这意味着在调用 timer.Start() 之后将继续执行。这会立即结束您的程序。您可以做的最明显的解决方案是在调用 timer.Start() 后以无限循环发送您的 main
-
“不起作用”是什么意思? (另外,我很好奇,这是您用于测试的值还是您尝试使用较低的间隔?)
-
当然
Main退出 - 在timer.Start();之后没有代码。因此,如果您的应用程序无事可做,Thread.Sleep并不比使用计时器更糟糕。也就是说,为此使用计时器(或Thread.Sleep)仍然不是一个好主意。为什么不使用例如windows任务计划程序代替?你到底想做什么?为什么要运行一个仅在启动数小时后才执行某些操作的应用程序? -
你甚至不需要计时器,记录开始时间,进入一个未绑定的循环,然后定期检查时差和睡眠。