2016-03-16 40 views
0

所以我想暫停程序5秒鐘,然後繼續執行程序的其餘部分。這是我迄今爲止的要點。使用c#的tickcount來延遲程序

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秒後要清除它。

+1

tickerStart'從來沒有發生在你的代碼'的值,以便'tickerStart <5000'總是會返回FALSE或TRUE;。 – Enigmativity

回答

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將不會更新而代碼正在運行。

相反,您需要使用某種計時器才能完成此操作。

我建議你使用微軟的反應框架(的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 */}代碼塊。