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

时间:2012-02-02 19:10:37

标签: c# .net multithreading threadpool

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

目前,我喜欢这个

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

提前谢谢。

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

10 个答案:

答案 0 :(得分:6)

请参阅this MSDN reference on the System.Threading.Timer class。在测试/学习时,有一个很好的解释,所有的班级成员,以及一些示例代码。

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

答案 1 :(得分:4)

如果睡眠在主线程上,您的软件将冻结。请记住,参数以毫秒为单位。 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();

答案 2 :(得分:4)

使用计时器!

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
}

答案 3 :(得分:2)

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

更新

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

看看Thread.Sleep(300) not working correctly

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

答案 6 :(得分:1)

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

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

任何一种方法都可用于在一定的时间间隔后定期执行一项功能。

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

答案 7 :(得分:1)

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

你应该在这里找到答案:Safe Thread Synchronization

答案 8 :(得分:1)

您可以替换

Thread.Sleep(X);

通过

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

答案 9 :(得分:0)

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