所以我希望暂停程序5秒钟,然后继续执行程序的其余部分。这是我到目前为止的要点。
tickerStart = System.Environment.TickCount;
do
{
//this is part of my own library, it generates a shape in a different window
numbers.AddText(Convert.ToString(number), 100);
}
while (tickerStart < 5000);
numbers.AddRectangle(0, 0, 800, 600, Color.Black);
//This last line simply clears the screen
Console.Readkey();
基本上,我想在不同的窗口中生成一些文本,然后想在5秒后清除它。
答案 0 :(得分:0)
在您在问题中提供的代码中,您没有更新tickerStart
,因此while
循环中的条件永远不会改变。
作为基本修复 - 但不推荐 - 你应该这样做:
tickerStart = System.Environment.TickCount;
do
{
numbers.AddText(Convert.ToString(number), 100);
}
while (System.Environment.TickCount - tickerStart < 5000);
numbers.AddRectangle(0, 0, 800, 600, Color.Black);
但是,建议不要使用此代码,因为它会阻止UI线程,因此在代码运行时UI不会更新。
相反,你需要使用某种计时器来完成这项工作。
我建议使用Microsoft的Reactive Framework(NuGet“Rx-WinForms”或“Rx-WPF”)。我假设使用此代码的Winforms:
Observable
.Timer(TimeSpan.Zero, TimeSpan.FromSeconds(0.1)) //start immediately, then every 0.1s
.Take(50) // 5 seconds = 50 x 0.1s
.ObserveOn(this)
.Subscribe(
n => numbers.AddText(Convert.ToString(number), 100), //each timer tick
() => numbers.AddRectangle(0, 0, 800, 600, Color.Black)); //at end
如果您使用的是WPF,则.ObserveOn(this)
会更改为.ObserveOnDispatcher()
。
请注意 - 这不会延误您的计划。如果您确实尝试延迟UI将不会更新。因此,您需要将代码需要的代码放在() => { /* finally */}
代码块中。