2016-06-28 8 views
1

以下は私が作成しているデスクトップタスクタイマーの経過時間タイマーとして使用しようとしているコードです。これが実行されるとすぐに60秒にカウントされ、リセットされて分に追加されることはありません。タイマーは60秒後にリセットされます

//tick timer that checks to see how long the agent has been sitting in the misc timer status, reminds them after 5 mintues to ensure correct status is used 
private void statusTime_Tick(object sender, EventArgs e) 
{ 
    counter++; 
    //The timespan will handle the push from the elapsed time in seconds to the label so we can update the user 
    //This shouldn't require a background worker since it's a fairly small app and nothing is resource heavy 

    var timespan = TimeSpan.FromSeconds(actualTimer.Elapsed.Seconds); 

    //convert the time in seconds to the format requested by the user 
    displaycounter.Text=("Elapsed Time in " + statusName+" "+ timespan.ToString(@"mm\:ss")); 

    //pull the thread into updating the UI 
    Application.DoEvents(); 

} 
+0

あなたはタイマーが初期化された方法を共有することはできます? –

答えて

4

クイックフィックス

私はこの問題は、あなたが0-59であるSecondsを使用していることであると信じています。あなただけの直接TimeSpanオブジェクトを使用することができますしかし、これは多くの意味がありません

var timespan = TimeSpan.FromSeconds(actualTimer.Elapsed.TotalSeconds); 

コメント

を:あなたは、あなたの既存のコードでTotalSecondsを使用したい

var timespan = actualTimer.Elapsed; 

また、すべてのアプリケーションが表示されるわけではありませんが、に電話する必要はありません210。チャンスがあるときにUIが自動的に更新されるはずです...そうでなければ、UIをブロックしているコードを別のスレッドに移動してみてください。


言ったことすべてで

勧告、私はあなたがすべてで、経過時間を追跡するためにタイマーを使用しないことをお勧めします。タイマーは時間の経過とともに精度を失う可能性があります。最善の方法は、プロセスを開始するときに現在のシステム時間を保存し、次に 'タイマー'を表示する必要があるときにその時点でオンデマンド計算を実行することです。

私が何を意味するか説明するための非常に単純な例:あなたはその後、定期的にあなたのUpdateDisplayメソッドを呼び出すためにタイマーを使用することができ

DateTime start; 

void StartTimer() 
{ 
    start = DateTime.Now; 
} 

void UpdateDisplay() 
{ 
    var timespan = DateTime.Now.Subtract(start); 
    displaycounter.Text = "Elapsed Time in " + statusName + " " + timespan.ToString(@"mm\:ss")); 
} 

void statusTime_Tick(object sender, EventArgs e) 
{ 
    UpdateDisplay(); 
} 
関連する問題