在Xamarin.Forms中具有启动,暂停和停止的简单计时器

时间:2017-06-02 11:02:10

标签: xamarin.forms

    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;
        });


    }

我试图每隔一秒运行一次计时器。它运行良好但是当点击暂停时,它不会停止,直到再次点击开始。

3 个答案:

答案 0 :(得分:0)

我不知道究竟是如何工作的,但我认为它的工作原理是这样的。 每当你点击RunTimer时,就会创建一个线程来运行计时器,所以当你按下Start时,计时器会启动并且每秒钟就会出现一次。但是,当您按Pause时,根据您的代码,第一个线程将继续运行,因为到目前为止它还没有返回false。这就是你的暂停不起作用的原因。 要解决这个问题,请尝试将Value作为一个全局字段(使其成为私有成员),并将其返回而不是true或false,这样当您单击暂停时,您可以使用" Value"假。

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;
    });
}

我希望这对你有用,我自己没有尝试过,只是使用我的逻辑;)

答案 1 :(得分:0)

  

抱歉英语不好

Device.StartTimer命令在调用后启动一个独立的线程。单击“开始”时,StartTimer线程中的参数值将始终为true;

我建议你将Value变量移到线程外面,把它放在类级别再试一次。

答案 2 :(得分:0)

您可以使用以下代码更改代码:

public void RunTimer(Boolean value)        {
Boolean executeTimer = value;            
Device.StartTimer(new TimeSpan(0, 0, 1), () =>            {                
string LblText = "";                            
if (value)                
{                    
TotalTime = TotalTime - TimeElement.Add(new TimeSpan(0, 0, 1));                                    
SMSSendLableText = string.Format("{0:hh\\:mm\\:ss}", TotalTime);                    
return true;                }                
else                
{                    
return false;                
}            
});}