2017-06-02 182 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变量,把它放在类级别,然后再试一次。