2017-06-01 88 views
0

我有一些涉及系統計時器的代碼,當一個文件被添加到一個文件夾中時,它會在幾秒鐘內開始計數,然後當它被移除時停止。當計時器停止是顯示了正確的時間但是當我重新啓動定時器它拿起它離開的地方,而不是重新啓動在0。這裏是我的代碼..系統計時器c#

 t2 = new System.Timers.Timer(); 
     t2.AutoReset = true; 
     t2.Interval = 1000; 
     t2.Elapsed += OnTimeEvent2; 
     watch(); 

    } 
    private void OnTimeEvent2(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     Invoke(new Action(() => 
     { 

      s += 1; 

      lblSeconds.Text = string.Format(s.ToString()); 

     })); 
    } 
+2

你期待's'回去0?如果是這樣,那麼當你停止(或啓動)定時器時,實際上*要將*'s'設置爲0。你做? –

+1

這種增加計數器的方法在較長時間內會非常不準確。使用[Stopwatch](https://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch(v = vs.110).aspx)類,只需更新標籤定時器事件。 –

+0

我是新來的定時器,我不確定如何實現秒錶類。你可以給我一個樣品與之合作嗎? – Marcus

回答

0

使用System.Windows.Forms.Timer,因此您不必擔心跨線程。下面是使用秒錶類的一個簡單的例子:

private System.Windows.Forms.Timer tmr = new Timer(); 
private System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); 

private void Form1_Load(object sender, EventArgs e) 
{ 
    tmr.Interval = 1000; 
    tmr.Tick += Tmr_Tick; 
    tmr.Start(); 
    sw.Start(); 
} 

private void Tmr_Tick(object sender, EventArgs e) 
{ 
    lblSeconds.Text = ((int)sw.Elapsed.TotalSeconds).ToString(); 
} 

爲了從計時器從0開始再次,只需使用Restart()方法:

private void button1_Click(object sender, EventArgs e) 
{ 
    sw.Restart(); 
} 
+0

完美的感謝您的幫助 – Marcus

0

你可能想要做別的事情阻止許多定時器運行: 創建文件時,在某處註冊DateTime並在該文件上放置一個filesystemwatcher

..然後在觀察者刪除事件上再次獲取DateTime並比較它們。實際上,如果您只是監視文件夾的外觀和特定文件的消失,則filesystemwatcher可以幫助您檢測這兩個事件。

否則請記住在檢測到文件刪除時手動重新啓動計數器。

0

我會推薦使用DispatcherTimer來代替。這樣你就不需要手動在GUI線程上調用。此外,它將重置爲Stop/Start

+0

這看起來像winforms問題,它不是關於重啓計時器,而是關於重置定時器在'Label'中顯示的值。 – Sinatr

+0

是的,這是我正在嘗試做的事情,當計時器停止時,我有一種方法來獲取標籤的值,然後將其重置爲零,然後在新文件擊中文件夾時再次啓動我正在使用工具箱中的計時器但它會快速開始計算,而不是保持正常的速度。 – Marcus