2013-11-02 37 views
0

我在用戶按下按鈕後每3秒發送一次命令給控制器時使用計時器。用戶再次按下相同的按鈕後,定時器應停止。但在我的情況下,計時器不會停止。我使用以下方式使用計時器。定時器不會停止c#

private void autoModeTempBtn_Click(object sender, EventArgs e) 
    { 
     System.Timers.Timer tempTimer = new System.Timers.Timer(3000); 
     tempTimer.SynchronizingObject = this; 
     tempTimer.AutoReset = true; 

     if (autoModeTempBtn.Text == "Get Temperature Auto Mode") 
     { 
      autoModeTempBtn.Text = "hello"; 

      tempTimer.Elapsed += new System.Timers.ElapsedEventHandler(OnTemperatureEvent); 
      tempTimer.Enabled = true; 
     } 
     else /*user presses button second time */ 
     { 
      tempTimer.Stop(); 
      tempTimer.AutoReset = false; 
      tempTimer.Enabled = false; 
      autoModeTempBtn.Text = "Get Temperature Auto Mode"; 
     } 
    } 
    private void OnTemperatureEvent(object source, System.Timers.ElapsedEventArgs e) 
    { 
     //do something 
    } 

我在哪裏犯錯?

+0

你不可能停止計時,你不能到計時器對象的引用,因爲它是你的Click事件處理程序的局部變量。所以它只是在滴答滴答,滴答滴答。把它變成你班上的一個領域。 –

回答

2

您每次單擊按鈕時都會創建新的計時器。創建一次定時器,每次點擊時啓動/停止。此外,您應該使用System.Windows.Forms.Timer而不是System.Timers.Timer

var _timer = new Timer() { Interval = 3000 }; 

private void autoModeTempBtn_Click(object sender, EventArgs e) 
{ 
    if (!validateSerialNumber()) 
     return; 

    if (!_timer.Enabled) 
    { 
     _timer.Start(); 
     autoModeTempBtn.Text = "hello"; 
    } 
    else 
    { 
     _timer.Stop(); 
     autoModeTempBtn.Text = "Get Temperature Auto Mode"; 
    } 
} 

而這個代碼添加到你的構造:

_timer.Tick += OnTemperatureEvent; 
+0

感謝您的建議,使用Windows.Forms.Timer代替Timers.Timer解決了我的問題。 – prattom