如何在xamarin窗体的后台运行计时器?

如何在xamarin窗体的后台运行计时器?,xamarin,xamarin.forms,Xamarin,Xamarin.forms,在我的应用程序中,我想设置一个计时器来计算工作时间。我的计时器工作正常,但当我切换到另一页时,它就停止工作了。如何在后台运行计时器和计算总运行时间。这是我的密码 Stopwatch st=新秒表(); 私有void WorkClockStart(对象发送方,事件参数e) { 如果(LaborClock.Text==“开始工作时钟”) { LaborClock.Text=“停止工作时钟”; Device.StartTimer(时间跨度从毫秒(1),()=> { st.Start(); 返回fals

在我的应用程序中,我想设置一个计时器来计算工作时间。我的计时器工作正常,但当我切换到另一页时,它就停止工作了。如何在后台运行计时器和计算总运行时间。这是我的密码

Stopwatch st=新秒表();
私有void WorkClockStart(对象发送方,事件参数e)
{
如果(LaborClock.Text==“开始工作时钟”)
{
LaborClock.Text=“停止工作时钟”;
Device.StartTimer(时间跨度从毫秒(1),()=>
{
st.Start();
返回false;
});
}
其他的
{
st.Stop();
长时间运行=st.ElapsedMilliseconds;
var sec=经过的时间/1000;
显示警报(“消息”,“工作时间(秒):”+秒,“正常”);
LaborClock.Text=“开始工作时钟”;
圣重置();
} 
}

如何在Xamarin.Forms中实现这一点?

为什么要使用计时器?启动手表时,只需将
DateTime.Now
存储在一个变量中,然后使用
DateTime.Now
停止手表时,即可计算增量。
然后,您可以在任何地方存储(例如,在
静态
变量中,或者在App.cs中,如果您需要,可以根据您的要求)

我同意Daniel的观点,您可以使用
日期时间
任务.工厂.StartNew
,如下代码

Task.Factory.StartNew( async() =>
                        {
                                var time = DateTime.Now;
                                var counter = 30;
                                transactionItem.RetryCount = 30;
                                do
                                {
                                    await Task.Delay(1000);
                                    counter = Math.Abs((DateTime.Now - time.AddSeconds(29)).Seconds);

                                 } while (counter != 0 && time.AddSeconds(29) > DateTime.Now);
                        });

将您的
Stopwatch
变量移动到应用程序(App.cs)级别,这样就不会在每次创建此页面时都重新创建它。添加到Daniel的好答案中。计时器在移动平台上不可靠。根据应用程序的状态和平台,对长时间运行的后台线程有限制。出于这个原因,Datetime delta是一种优越得多的方法。