C#中Thread.Sleep的替代方案?

我有一个代码,在运行时,它按顺序执行一系列行。 我想在两者之间添加一个暂停。

目前,我有这样的

//do work Thread.Sleep(10800000); //do work 

然而,这会冻结软件,我认为这是因为睡眠时间过长。 我在网上搜索,发现另一个名为Timer的工作。 有人可以给我看一个Timer的示例代码,它的工作原理就像Thread.sleep一样吗?

先感谢您。

编辑:我需要软件等待3个小时才能继续执行其余的代码。 该软件用于与机器通信,我不能让其余的代码在等待3个小时时执行。

如果睡眠在主线程上,您的软件将冻结。 请记住,参数以毫秒为单位。 10 800 000毫秒= 10 800秒

另一种传递时间的方法是传递TimeSpan对象。 例如:

 // Sleep for 10 seconds System.Threading.Thread.Sleep(new TimeSpan(0, 0, 10)); 

至于计时器:

您可以使用System.Timers.Timer ;

 Timer timer = new Timer(); timer.Interval = 20; // milliseconds timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); timer.AutoReset = true; // if not set you will need to call start after every event fired in the elapsed callback timer.Start(); 

请参阅System.Threading.Timer类上的此MSDN参考 。 有一个很好的解释,所有的类成员,以及一些示例代码供您在测试/学习时遵循。

但请注意,当您想要以特定间隔触发事件时,应使用Timer 。 如果您只是想暂停执行应用程序,那么您应该使用Thread.Sleep() 。 但是,正如许多其他人所指出的那样,您导致线程长时间hibernate。

使用计时器!

 private DispatcherTimer Timer; public Constructor { Timer = new System.Windows.Threading.DispatcherTimer(); Timer.Tick += new EventHandler(Timer_Tick); Timer.Interval = new TimeSpan(0,0,10); Timer.Start(); } private void Timer_Tick(object sender, EventArgs e) { Timer.Stop(); Timer -= Timer_Tick; Timer = null; // DO SOMETHING } 

您的问题是您正在阻止应用程序的主线程,该主线程负责保持ui运行。 你不应该这样做。 而是使用计时器 – 在Forms应用程序中,Forms one可能是最简单的,或者考虑使用BackgroundWorker。 (对于这么长的等待,计时器可能更合适)

Thread.Sleep是您想要使用的,您可能希望使用比3小时更合理的睡眠时间。

更新:

阅读完一些评论后, Thread.Sleep可能不是你想要的。 正如其他人所建议的那样使用System.Threading.Timer

看看Thread.Sleep(300)无法正常工作

可能你需要使用“Dispatcher”。 看看这里

Thread.Sleep通常用于暂停单独的线程,而不是在应用程序的主线程中。

定时器通常用于周期性地使主线程停止其正常操作并处理事件。

这两种方法都可以用于在一定时间间隔之后周期性地执行function。

我不会做的是让主线程睡3个小时。

我认为你应该使用一个监视器 。 当您需要继续运行程序时,它可以帮助您等待对象并释放锁定。

你应该在这里找到你的答案: 安全线程同步

你可以替换

 Thread.Sleep(X); 

通过

 Task.WaitAll(Task.Delay(X)); 

你正在睡觉10800秒,或3个小时。 Thread.Sleep()旨在冻结你的线程,阻止任何东西在软件中工作那段时间。 在这种情况下,持续时间为18分钟。 你想做什么?