2011-11-01 108 views
10

我想用C#進行倒計時,並顯示格式的時間:C#倒計時

hour:minutes:seconds 

我已經試過這樣:

var minutes = 3; //countdown time 
    var start = DateTime.Now; 
    var end = DateTime.Now.AddMinutes(minutes); 
    Thread.Sleep(1800); 
    if (??) // I tried DateTime.Now > end not works 
    { 
     //... show time 
     label1.Text = "..."; 
    } 
    else 
    { 
    //done 
     label1.Text = "Done!"; 
    } 

不同方式也是解決這個問題出現了。在此先感謝

+0

如果要定期更新的標籤,你需要像一個循環。 – svick

+2

@javasocute我做了他,我會懷疑他的理智。這是Winforms,.net有處理這些東西的完美機制。沒有必要爲這樣的小東西帶來JavaScript。 – CodesInChaos

回答

28

您不應該在這裏使用Thread.Sleep。 UI線程上的Thread.Sleep線程會阻塞UI,並且在另一個線程上使用它會由於線程同步而導致額外的複雜性。

如果您有C#5或異步CTP,您可能會編寫與您所做的代碼非常相似的代碼,因爲您會獲得基於延續的等效Thread.Sleep,該代碼不會阻止UI。

在標準C#4中,我會使用System.Windows.Forms.Timer

開始倒數​​:

var minutes = 3; //countdown time 
var start = DateTime.UtcNow; // Use UtcNow instead of Now 
endTime = start.AddMinutes(minutes); //endTime is a member, not a local variable 
timer1.Enabled = true; 

在你寫的定時器處理:

TimeSpan remainingTime=endTime-DateTime.UtcNow; 
if(remainingTime<TimeSpan.Zero) 
{ 
    label1.Text = "Done!"; 
    timer1.Enabled=false; 
} 
else 
{ 
    label1.Text = remainingTime.ToString(); 
} 

對於其他格式化選項見Standard TimeSpan Format Strings

該代碼仍然存在的一個問題是,如果系統時鐘更改,它將無法正常工作。

當使用DateTime.Now而不是DateTime.UtcNow時,從夏令時切換到夏時制或更改時區時也會中斷。既然你想識別某個時間點(而不是顯示時間),你應該使用UTC而不是本地時間。

+0

非常感謝! +1爲好的答案,但我有一個問題在statament:'錯誤:運算符'<'不能應用於'System.TimeSpan'和'int''類型的操作數如何修復它? –

+0

@TheMask使用'TimeSpan.Zero'而不是'0' – CodesInChaos

+1

CodeInChaos:事情真正起作用的人。完美的作品。非常感謝。 :) –

0

您的代碼設置變量,然後進入睡眠3分鐘,以便if語句不會執行,直到它離開睡眠狀態。無論是設立一個新的線程來更新UI或做這樣的事......

while (DateTime.now < end) { 
    label1.Text = "..."; 
    Thread.Sleep(#); //Pick a second, or 5 or whatever 
} 

label1.Text = "Done!"; 

有了第二個線程你仍然可以做的東西在你的程序,而它的工作原理。 「搞定!」將在其完成後出現。

+1

使用計時器,而不是'Thread.Sleep()'。使用睡眠是一種線程的浪費。 –

+0

非常感謝,我不是一個C#人的心臟,只是建立他的代碼。 – Grambot

+0

他們在Java中有定時器:) –

5

我會使用一個像這樣的計時器。首先是幾個實例變量。

private int _countDown = 30; // Seconds 
private Timer _timer; 

,並在構造函數或Load事件

_timer = new Timer(); 
_timer.Tick += new EventHandler(timer_Tick); 
_timer.Interval = 1000; 
_timer.Start(); 

,最後事件處理

void timer_Tick(object sender, EventArgs e) 
{ 
    _countDown--; 
    if (_countDown < 1) 
    { 
     _countDown = 30; 
    } 
    lblCountDown.Text = _countDown.ToString(); 
} 
1

你也可以使用一個定時器,因爲這將處理所有的問題像UI鎖定。 您可以使用定時器System.Windows.Forms.Timer。在MSDN庫中,您可以找到使用它的示例。

WinForms-Timer還處理跨越Timer線程和UI線程的調用。

- SeriTools