1

是否有可能以某种方式返回 Thread.Sleep 上还剩多少秒?

我已经尝试过使用 while 循环和 Thread.Sleep() 的其他方法,但从未让它正常工作。

基本上我想用剩下多少时间来更新一个列表视图字段

4

3 回答 3

3

虽然我同意 vcsjones 所说的。满足您的要求的最佳方式

int millisecondsToSleep=2000;
while (milliseconds>0)
{
    Thread.Sleep(500);
    millisecondsToSleep=millisecondstoSleep-500;
    //alert yourself how much time you have left
    MessageBox.Show(millisecondsToSleep.ToString());
    //do something else if you wish
}

所以这会睡半秒钟,然后向您发送剩余时间的警报

至于计时器

            Timer myTimer = new Timer();
            myTimer.Interval = 2000; //2 seconds
            myTimer.Tick += new EventHandler(myTimer_Tick);// fires the myTimer_Tick event every 2 seconds
于 2012-05-10T18:36:04.783 回答
1

Thread.Sleep将停止线程执行任何操作。它也不是完全准确(尽管我真的不知道它有多准确)。如果你想让一个线程休眠,然后显示一个显示剩余时间的字段;我认为最好的方法是

1.) 让你的一个线程休眠 X 秒

2.) 在你的 UI 线程上启动一个 Timer,它每秒触发 X 秒,进行数学运算并显示估计的剩余时间。

我能想到的另一种选择是让同一个线程 Sleep 并显示它的剩余时间;但你需要做一些像 L'Leg 建议的事情。

也许我误解了你的目标是什么;但我无法想象你想要其中任何一种行为的情况。

如果您正在另一个线程中完成工作,并且您想报告还剩多少时间 - 不妨看看使用 BackgroundWorker 并使用“ReportProgress”。

于 2012-05-10T18:36:44.530 回答
0

调用Thread.Sleep有时可能是一种代码气味。在没有确切了解您如何使用它的情况下,我不能提倡在您的场景中使用它。但是,除此之外,以下课程可能会解决您的问题。虽然,我个人无法想到我会使用它的情况。

public class Sleeper
{
  private TimeSpan remaining = TimeSpan.Zero;

  public TimeSpan GetRemaining()
  {
    lock (this)
    {
      if (remaining > TimeSpan.Zero)
      {
        Monitor.Pulse(this);
        Monitor.Wait(this);
      }
      return remaining;
    }
  }

  public void Sleep(TimeSpan timeout)
  {
    lock (this)
    {
      if (remaining > TimeSpan.Zero)
      {
        throw new InvalidOperationException("Sorry, but I'm not safe for multiple sleepers.");
      }
      remaining = timeout;
      DateTime expires = DateTime.UtcNow.Add(remaining);
      bool complete = remaining <= TimeSpan.Zero;
      while (!complete)
      {
        bool complete = Monitor.Wait(this, remaining);
        remaining = expire - DateTime.UtcNow;
        if (remaining <= TimeSpan.Zero)
        {
          complete = true;
        }
        if (complete)
        {
          remaining = TimeSpan.Zero;
        }
        Monitor.Pulse(this);
      }
    }
  }
}

然后像这样使用它。

public static void Main()
{
  var sleeper = new Sleeper();

  Task.Factory.StartNew(
    () =>
    {
      while (true)
      {
        sleeper.Sleep(TimeSpan.FromMinutes(1);
      }
    });

  while (true)
  {
    Console.WriteLine("Press ENTER to get time remaining...");
    Console.ReadLine();
    TimeSpan remaining = sleeper.GetRemaining();
    Console.WriteLine("Remaining = " + remaining.ToString());
  }
}

同样,只有少数情况下我可以想象这可能有用。我想一个更复杂的锁存器变体更关注时序可能是有用的。它的工作原理与我在上面创建的非常相似。您可以将其称为“定时锁存器”,它还可以向任何感兴趣的调用者报告其到期时间。

于 2012-05-10T20:50:24.947 回答