如何增加2或3秒的延迟[关闭]


129

如何在C#中为程序添加延迟?


2
有几种方法可以执行此操作,但是为什么需要增加延迟?如果我们知道,那么我们将能够建议最合适的方法。
克里斯·

3
毫无疑问,这个问题文档不足,因此无法推荐Thread.Sleep()。
汉斯·帕桑

1
只是为了澄清起见,我投票结束了这个问题,因为您没有提供足够详细的信息给任何人以给出良好的,高质量的答案。如果您确实要尝试添加更多详细信息,我非常愿意将其作为一个有效的问题重新打开。投票决定尽早关闭是防止对质量较差问题产生“噪音”答案的一种方法。添加更多详细信息后,请给我留言和/或标记一个mod以重新打开它。
科迪·格雷

14
解决这个问题的错误决定。这是一个问题,自然可以通用。我完全理解。
user2430797 '17

5
我正在寻找的另一个问题,由一个无缘无故被关闭的问题回答。
格伦·梅纳德

Answers:


176

您可以使用Thread.Sleep()功能,例如

int milliseconds = 2000;
Thread.Sleep(milliseconds);

完全停止当前线程的执行2秒钟。

可能最适合的情况Thread.Sleep是,当您想延迟另一个线程中的操作时,不同于主要线程,例如:

 MAIN THREAD        --------------------------------------------------------->
 (UI, CONSOLE ETC.)      |                                      |
                         |                                      |
 OTHER THREAD            ----- ADD A DELAY (Thread.Sleep) ------>

对于其他情况(例如,一段时间后开始操作等),请查看Cody的答案


13
避免使用Thead.Sleep原因它将完全阻止当前线程执行任何操作,直到持续时间结束。
Mohammed Swillam 2011年

7
@穆罕默德:是的,当然它将完全阻塞胎面。但是有时它可能会很有用...它实际上取决于OP的需求...
digEmAll 2011年

12
由于我无法发布新答案,因此我想发表评论-如果您不希望它阻止该程序,则可以使用await Task.Delay(milliseconds)。这对我
有用

就我而言,我不能使用await,因为我是从别人编写的程序的一部分中被调用的。不能等待,但是如果我“挂起”,我可以工作10秒钟,然后关闭我的东西。睡2秒钟就像一个魅力;)因此,在某些情况下就是这样。
ecth,2016年

@MohammedElSayed:答案取决于。这完全取决于使用目的。对于我的情况,我需要精确地使线程休眠0.6秒,以避免在插入数据库时​​出现索引约束。
GunWanderer

61

使用间隔设置为2-3秒的计时器。

根据要编写的应用程序类型,您可以选择三个不同的选项:

  1. System.Timers.Timer
  2. System.Windows.Forms.Timer
  3. System.Threading.Timer

Thread.Sleep如果您的应用程序需要同时处理该线程上的任何输入(WinForms,WPF),请不要使用,因为这Sleep将完全锁定该线程并阻止其处理其他消息。假定一个单线程应用程序(大多数情况下),您的整个应用程序将停止响应,而不仅仅是延迟您可能想要的操作。请注意,在纯控制台应用程序中使用Sleep可能会很好,因为没有要处理的“事件”或没有单独的线程(也是Task.Delay更好的选择)。

除了计时器外,Sleep您还可以使用Task.Delay的异步版本Sleep,它不会阻止线程处理事件(如果使用得当,请不要通过使用使其变为无限睡眠.Wait())。

 public async void ClickHandler(...)
 {
      // whatever you need to do before delay goes here         

      await Task.Delay(2000);

      // whatever you need to do after delay.
 }

如果使用C#7.1(MSDN博客上的Async main),await Task.Delay(2000)则可以在Main控制台应用程序的方法中使用相同的方法。

注意:延迟操作的Sleep好处是避免了由于可能使用timers /启动多个操作而导致的竞争情况Delay。不幸的是,冻结基于UI的应用程序是不可接受的,因此您需要考虑如果启动多个延迟(即,如果它是由单击按钮触发的)会发生什么情况-请考虑禁用此类按钮,或者取消计时器/任务或确保延迟操作可以安全地进行多次。


5
如果它是控制台应用程序,则Thread.Sleep警告可能不那么重要。
Merlyn Morgan-Graham

1
有第四个计时器:System.Web.UI.Timer,这是一个ASP.NET组件,该组件定期执行异步或同步网页回发。
大卫

1
应该是最佳答案。如果这有一个使用计时器的例子,它将获得更多的选票……
Mercutio

Cody Gray,您能添加await Task.Delay()控制台应用程序实际上可能想要使用的版本和内联注释吗Sleep(非异步Main)或Delay(异步Main
Alexei Levenkov

1
@CodyGray完成。
阿列克谢·莱文科夫


6
System.Threading.Thread.Sleep(
    (int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);

或带有using语句:

Thread.Sleep((int)TimeSpan.FromSeconds(2).TotalMilliseconds);

我更喜欢1000 * numSeconds(或简单地说3000)这是因为它使过去从未使用Thread.Sleep过的人的情况变得更加明显。它可以更好地记录您的意图。


2
+1超过1000的时间跨度*
左撇子

从.NET 4开始,您可以Thread.Sleep(TimeSpan)直接使用,而不必强制转换为int。
Holf
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.