线程的替代方案.在C#中休眠

本文关键字:休眠 方案 线程 | 更新日期: 2023-09-27 18:22:12

我有一个代码,当运行时,它会按顺序执行一系列行。我想在两者之间稍作停顿。

目前,我有这样的

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

然而,这冻结了软件,我认为这是因为睡眠时间太长了。我在网上搜索了一下,发现了另一个名为Timer的作品。有人能给我看一个Timer的示例代码吗?它和Thread.sleep一样工作?

提前谢谢。

编辑:我需要软件等待3个小时,然后再继续执行其余的代码。这个软件是用来与机器通信的,我不能让其余的代码在等待3个小时时执行。

线程的替代方案.在C#中休眠

请参阅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分钟。你想干什么?