是否有可能以某种方式返回 Thread.Sleep 上还剩多少秒?
我已经尝试过使用 while 循环和 Thread.Sleep() 的其他方法,但从未让它正常工作。
基本上我想用剩下多少时间来更新一个列表视图字段
是否有可能以某种方式返回 Thread.Sleep 上还剩多少秒?
我已经尝试过使用 while 循环和 Thread.Sleep() 的其他方法,但从未让它正常工作。
基本上我想用剩下多少时间来更新一个列表视图字段
虽然我同意 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
Thread.Sleep
将停止线程执行任何操作。它也不是完全准确(尽管我真的不知道它有多准确)。如果你想让一个线程休眠,然后显示一个显示剩余时间的字段;我认为最好的方法是
1.) 让你的一个线程休眠 X 秒
2.) 在你的 UI 线程上启动一个 Timer,它每秒触发 X 秒,进行数学运算并显示估计的剩余时间。
我能想到的另一种选择是让同一个线程 Sleep 并显示它的剩余时间;但你需要做一些像 L'Leg 建议的事情。
也许我误解了你的目标是什么;但我无法想象你想要其中任何一种行为的情况。
如果您正在另一个线程中完成工作,并且您想报告还剩多少时间 - 不妨看看使用 BackgroundWorker 并使用“ReportProgress”。
调用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());
}
}
同样,只有少数情况下我可以想象这可能有用。我想一个更复杂的锁存器变体更关注时序可能是有用的。它的工作原理与我在上面创建的非常相似。您可以将其称为“定时锁存器”,它还可以向任何感兴趣的调用者报告其到期时间。