线程的替代方案.在C#中休眠
本文关键字:休眠 方案 线程 | 更新日期: 2023-09-27 18:22:12
我有一个代码,当运行时,它会按顺序执行一系列行。我想在两者之间稍作停顿。
目前,我有这样的
//do work
Thread.Sleep(10800000);
//do work
然而,这冻结了软件,我认为这是因为睡眠时间太长了。我在网上搜索了一下,发现了另一个名为Timer的作品。有人能给我看一个Timer的示例代码吗?它和Thread.sleep一样工作?
提前谢谢。
编辑:我需要软件等待3个小时,然后再继续执行其余的代码。这个软件是用来与机器通信的,我不能让其余的代码在等待3个小时时执行。
请参阅System.Threading.Timer
类上的MSDN参考资料。这里有一个很好的解释,所有的类成员,以及一些示例代码,供您在测试/学习时遵循。
不过,请注意,当您希望以特定间隔激发事件时,应该使用Timer
。如果您只是想暂停应用程序的执行,那么您应该使用Thread.Sleep()
。然而,正如许多其他人指出的那样,你会导致你的线程长时间睡眠。
如果睡眠在主线程上,您的软件就会冻结。请记住,参数以毫秒为单位。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();
使用计时器!
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应用程序中最简单的计时器,或者考虑BackgroundWorker。(对于如此长的等待,计时器可能更合适)
Thread.Sleep
是您想要使用的,不过您可能希望使用比3小时更合理的睡眠时间。
更新:
在阅读了一些评论之后,Thread.Sleep
可能不是您想要的。按照其他人的建议使用System.Threading.Timer
。
看看Thread.Sleep(300)工作不正常
您可能需要使用"Dispatcher"。也可以在这里查看
Thread.Sleep通常用于暂停单独的线程,而不是在应用程序的主线程中。
定时器通常用于周期性地使主线程停止其正常操作并处理事件。
任何一种方法都可以用于在一定的时间间隔后周期性地执行功能。
我不会让主线程睡3个小时。
我认为您应该使用Monitor。它可以帮助您对对象进行等待,并在需要继续运行程序时释放锁定。
您应该在这里找到答案:安全线程同步
您可以替换
Thread.Sleep(X);
通过
Task.WaitAll(Task.Delay(X));
线程睡眠时间为10800秒,即3小时。Thread.Sleep()用于冻结线程,在该时间段内停止软件中的任何操作。在这种情况下,持续时间为18分钟。你想干什么?