C#中替代Thread.Sleep的方法是什么?

7

我有一段代码,运行时会按顺序执行一系列语句。我想在其中添加一个暂停。

目前的代码如下:

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

这会导致软件被冻结,我认为是因为休眠时间太长了。我在网上搜索并找到了另一种解决方法,称为Timer。有人能给我展示一个类似于Thread.sleep的Timer示例代码吗?
提前感谢您。
编辑:我需要软件等待3小时才能执行其余代码。该软件旨在与机器通信,在等待3小时时我不能让其余代码执行。

2
那么...使用更短的睡眠时间?10800000毫秒是三个小时。计时器和睡眠有不同的目的,你不能真正用一个替换另一个。 - millimoose
2
嗯,你为什么要请求一个10800秒的睡眠时间? - Qwertie
2
只是想澄清一下,你真的想要睡 10800000 毫秒(3小时)吗? - keyboardP
1
如果在 GUI 线程中使用 sleep 函数,那么会冻结所有用户输入。请不要这样做。 - Steve Wellens
1
"冻结软件", 如果您使其他线程(而不是主线程)休眠,它不应该冻结。 休眠3个小时很长时间。 您到底想做什么? 为什么要让线程休眠3个小时?" - craig1231
显示剩余5条评论
10个回答

6
请查看这个MSDN关于System.Threading.Timer类的参考文献。其中包括了对该类的所有成员的详细解释以及一些示例代码,方便你在测试和学习时使用。
需要注意的是,Timer应该用于想要在一定时间间隔内触发事件的情况。如果你只是想暂停应用程序的执行,则应使用Thread.Sleep()。然而,正如其他许多人指出的那样,这会导致线程长时间休眠。

4

如果该睡眠在主线程上,您的软件将会冻结。请记住,该参数是以毫秒为单位的。10800000毫秒 = 10800秒。

另一种传递时间的方法是传递一个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();

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
}

2
Thread.Sleep 是用于此目的的方法,但你可能希望使用一个比 3 小时更合理的休眠时间。
更新:
经过阅读一些评论之后,Thread.Sleep 可能不是你想要的。像其他人建议的那样,使用 System.Threading.Timer

如果要求是在运行某些代码之前等待3小时,那么使用 Thread.Sleep 不是他应该使用的。 - ken2k
它可能是一个始终存在的问题。它也没有说明它在表单上,可能是一个服务或命令提示符。虽然听起来他没有正确地做这件事,但有很多理由让某些事情每x小时发生一次(如数据库备份、清理功能等)。 - JeremyK
1
@JeremyK - 我承认我对他的评论读得太多了,但看到他的更新,不幸的是他没有做任何一个。 - M.Babcock

2

您的问题在于您正在阻塞应用程序的主线程,这是维持 UI 运行的责任。您不应该这样做。相反,请使用定时器 - 在表单应用程序中,Forms 定时器可能是最简单的选择,或者考虑 BackgroundWorker。(对于如此长的等待,定时器可能更合适)


1

你可以替换

Thread.Sleep(X);


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

1

1

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

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

任何一种方法都可以用于在一定时间间隔后定期执行函数。

我不会让主线程睡眠3个小时。


1

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

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


0

你正在让线程睡眠10800秒,即3小时。Thread.Sleep()旨在冻结您的线程,在此期间停止软件中的任何操作。在这种情况下,持续时间为18分钟。你想要做什么?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接