【问题标题】:Alternative to Thread.Sleep in C#?C# 中 Thread.Sleep 的替代方案?
【发布时间】:2012-02-02 19:10:36
【问题描述】:

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

目前,我有这样的

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

然而,这会冻结软件,我认为这是因为睡眠时间太长了。 我在网上搜索,发现了另一个名为 Timer 的解决方法。 有人可以给我看一个与 Thread.sleep 一样工作的 Timer 示例代码吗?

提前谢谢你。

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

【问题讨论】:

  • 所以...使用更短的睡眠时间? 10 800 000 毫秒是三个小时。定时器和睡眠有不同的用途,你不能真的用另一个代替。
  • 呃,你为什么要10800秒的睡眠时间?
  • 澄清一下,你真的要睡10800000 毫秒(3 小时)吗?
  • 如果你在 gui 线程中使用 sleep...它将冻结所有用户输入。不要那样做。
  • “冻结软件”,如果你休眠一个不同于主线程的线程,它不应该冻结。睡三个小时是很长的时间。你到底想做什么?为什么要让线程休眠 3 小时?

标签: c# .net multithreading threadpool


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      使用计时器!

      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
      }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          更新:

          看了一些cmets,Thread.Sleep可能不是你想要的。按照其他人的建议,改用System.Threading.Timer

          【讨论】:

          • 如果要求在运行一些代码之前等待3个小时,那么使用Thread.Sleep不是他应该使用的。
          • 这可能是一个永远存在的问题。它也没有在表单上说它可能是服务或命令提示符。虽然听起来他做得不对,但有很多理由让事情每 x 小时发生一次(数据库备份、清理功能等)。
          • @JeremyK - 我会告诉你我对他的 cmets 的了解太多了,但是看看他的更新,不幸的是他没有做任何这些。
          【解决方案6】:

          看看Thread.Sleep(300) not working correctly

          您可能需要使用“调度程序”。也可以看看here

          【讨论】:

            【解决方案7】:

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

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

            任何一种方法都可以用来在一定的时间间隔后周期性地执行一个功能。

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

            【讨论】:

              【解决方案8】:

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

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

              【讨论】:

                【解决方案9】:

                你可以替换

                Thread.Sleep(X);
                

                通过

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

                【讨论】:

                  【解决方案10】:

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2012-07-26
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-01-13
                    • 2018-02-06
                    • 2011-08-24
                    相关资源
                    最近更新 更多