【问题标题】:How to add a delay for a 2 or 3 seconds [closed]如何添加 2 或 3 秒的延迟 [关闭]
【发布时间】:2019-12-18 16:26:08
【问题描述】:

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

【问题讨论】:

  • 有几种方法可以做到这一点,但是为什么你需要添加延迟?如果我们知道,那么我们就能提出最合适的方法。
  • 这个问题的证据不足,无法推荐 Thread.Sleep()。
  • 只是为了澄清,我投票结束这个问题,因为你没有提供足够的细节让任何人给出一个好的、高质量的答案。如果您添加更多关于您正在尝试做什么的详细信息,我非常愿意将其作为一个有效问题重新打开。投票提前结束是一种防止对质量差的问题产生大量“噪音”答案的方法。添加更多详细信息后,请给我留言和/或标记模组以使其重新打开。
  • 关闭此问题的错误决定。这是一个问题,它本质上是通用的是可以的。我完全理解。
  • 我正在寻找的另一个问题,由一个无缘无故关闭的问题回答。

标签: c# delay


【解决方案1】:

你可以使用Thread.Sleep()函数,例如

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

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

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

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

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

【讨论】:

  • 避免使用 Thead.Sleep 原因它会完全阻止当前线程做任何事情,直到持续时间结束。
  • @Mohammed:是的,当然它会完全挡住胎面。但有时它可能很有用......这真的取决于 OP 需要什么......
  • 由于我无法发布新答案,我想发表评论——如果您不希望它阻止程序,您可以使用await Task.Delay(milliseconds)。这对我有用:)
  • 就我而言,我无法使用 await,因为我是从其他人编写的程序的一部分调用的。这是不可等待的,但如果我“挂起”,我可以在我的东西被关闭之前工作 10 秒。睡 2 秒就像一种魅力 ;) 所以在某些情况下,这就是方法。
  • @MohammedElSayed :答案取决于。这一切都取决于使用的意图。至于我的情况,我需要将线程精确地休眠 0.6 秒,以避免插入数据库时​​出现索引约束。
【解决方案2】:

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

您有三种不同的选项可供选择,具体取决于您编写的应用程序类型:

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

如果您的应用程序需要同时处理该线程上的任何输入(WinForms、WPF),请不要使用Thread.Sleep,因为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 (Async main on MSDN blogs),则可以在控制台应用程序的 Main 方法中使用相同的 await Task.Delay(2000)

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

【讨论】:

  • 如果是控制台应用程序,Thread.Sleep 警告可能没有那么重要。
  • 有第 4 个计时器:System.Web.UI.Timer,一个 ASP.NET 组件,它定期执行异步或同步网页回发。
  • 应该是最佳答案。如果这有使用其中一个计时器的示例,它将获得更多选票...
  • Cody Gray,您能否添加await Task.Delay() 版本和内联注释以表明控制台应用程序实际上可能想要 使用Sleep(非异步Main)或@987654348 @(异步Main)
  • 老实说,这不再是我的专长,@Alexei。我已经有 5 年没有接触过 C# 或 .NET 了?我没有跟上最新的发展。我对async 一无所知。如果您对自己的改进能力有信心,请随时编辑答案。
【解决方案3】:

2.3 秒你应该这样做:

System.Threading.Thread.Sleep(2300);

【讨论】:

    【解决方案4】:
    System.Threading.Thread.Sleep(
        (int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);
    

    或使用using 语句:

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

    1000 * numSeconds(或简单的3000)相比,我更喜欢这个,因为它让以前没有使用过Thread.Sleep 的人更清楚发生了什么。它可以更好地记录您的意图。

    【讨论】:

    • +1 表示 TimeSpan 超过 1000*
    • 从 .NET 4 开始,您可以直接使用 Thread.Sleep(TimeSpan),而无需转换为 int。
    猜你喜欢
    • 2022-01-27
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多