2017-06-02 180 views
0
private void btn_Start_Clicked(object sender, System.EventArgs e) 
    { 
     RunTimer(true); 
    } 

    private void btn_Pause_Clicked(object sender, System.EventArgs e) 
    { 
     RunTimer(false); 
    } 
    public void RunTimer(Boolean Value) 
    { 
     Boolean excuteTimer = Value; 
     TimeSpan TimeElement = new TimeSpan(); 

     Device.StartTimer(new TimeSpan(0, 0, 1),() => 
     { 
      if (Value) 
      { 
       TotalTime = TotalTime + TimeElement.Add(new TimeSpan(0, 0, 1)); 
       label.Text = string.Format("{0:hh\\:mm\\:ss}", TotalTime); 
       // returning true will fire task again in 2 minutes. 
       return true; 
      } 

      // No longer need to recur. Stops firing task 
      return false; 
     }); 


    } 

我試圖每隔一秒運行一個計時器。它運行良好,但單擊暫停時,它不會停止,直到再次單擊開始。在Xamarin.Forms中啓動,暫停和停止的簡單定時器

回答

0

我不知道這是如何工作的,但我認爲它是這樣工作的。每次點擊RunTimer時,都會創建一個線程來運行計時器,因此當您按下開始時,計時器將啓動並每隔一秒發生一次。但是,當你按暫停時,根據你的代碼,第一個線程將繼續運行,因爲到目前爲止它還沒有返回false。這就是爲什麼你的停頓不起作用。 要解決此問題,請嘗試將Value設置爲全局字段(使其成爲私有成員),然後將其返回而不是真或假,這樣當您單擊暫停時將「Value」設爲false即可。

private bool _isRunning; 

private void btn_Start_Clicked(object sender, System.EventArgs e) 
{ 
    _isRunning=true; 
    RunTimer(); 
} 

private void btn_Pause_Clicked(object sender, System.EventArgs e) 
{ 
    _isRunning=false; 
} 
public void RunTimer() 
{ 

    TimeSpan TimeElement = new TimeSpan(); 
    Device.StartTimer(new TimeSpan(0, 0, 1),() => 
    { 

      TotalTime = TotalTime + TimeElement.Add(new TimeSpan(0, 0, 1)); 
      label.Text = string.Format("{0:hh\\:mm\\:ss}", TotalTime); 
      // returning true will fire task again in 2 minutes. 
      return _isRunning; 
    }); 
} 

我希望這對你的作品,我還沒有嘗試過自己,只是用我的邏輯;)

0

對不起,我英文不好

的Device.StartTimer命令啓動調用一個獨立的線程。當您單擊開始時,StartTimer線程中的參數值將始終爲true;

我建議你在線程外部移動Value變量,把它放在類級別,然後再試一次。