Xamarin.Forms 中的 Device.StartTimer 与 System.Threading.Timer [关闭]
Posted
技术标签:
【中文标题】Xamarin.Forms 中的 Device.StartTimer 与 System.Threading.Timer [关闭]【英文标题】:Device.StartTimer vs System.Threading.Timer in Xamarin.Forms [closed] 【发布时间】:2020-02-15 03:01:53 【问题描述】:使用Device.StartTimer
与System.Threading.Timer
的优缺点是什么?
两者都在后台线程上触发,都跨平台和 netstandard2 兼容。 System.Threading.Timer
具有非 Xamarin 特定的奖励积分。
我应该使用什么以及何时使用?
Device.StartTimer 使用原生 API。 根据github.com/mono,System.Threading.Timer
似乎为所有定时器使用专用线程。我是对的,还是 Xamarin 使用其他实现?
【问题讨论】:
另外,关于如何在System.Threading.Timer
和 System.Timers.Timer
***.com/questions/1416803/… 之间进行选择,有一个很好的、被赞成且非常有用的问题。
【参考方案1】:
Xamarin 文档团队的官方回答: https://github.com/MicrosoftDocs/xamarin-docs/issues/2243#issuecomment-543608668
使用任何一个。
Device.StartTimer 早在 .NET Standard 出现之前就已经实现了,在那个时候,Timer 类对于 PCL 项目是不可用的。现在 Timer 类可用,没有优势/不需要使用 Device.StartTimer。但该 API 不会消失,因为仍有一些旧项目仍然依赖它。
【讨论】:
【参考方案2】:使用 Device.StartTimer 与 System.Threading.Timer?
Device.StartTimer
使用原生 api。因此,您应该提前调用它,因为它会使用设备时钟功能在 UI 线程上启动一个循环计时器。
Device.StartTimer(TimeSpan.FromSeconds(30), () =>
// Do something
return true; // True = Repeat again, False = Stop the timer
);
而在特定平台上,它会做以下事情。
ios
public void StartTimer(TimeSpan interval, Func<bool> callback)
NSTimer timer = NSTimer.CreateRepeatingTimer(interval, t =>
if (!callback())
t.Invalidate();
);
NSRunLoop.Main.AddTimer(timer, NSRunLoopMode.Common);
安卓
public void StartTimer(TimeSpan interval, Func<bool> callback)
var handler = new Handler(Looper.MainLooper);
handler.PostDelayed(() =>
if (callback())
StartTimer(interval, callback);
handler.Dispose();
handler = null;
, (long)interval.TotalMilliseconds);
【讨论】:
Docs 另有说明:>如果计时器内的代码与用户界面交互(例如设置标签的文本或显示警报),则应在 BeginInvokeOnMainThread 表达式中完成(见下文)。 docs.microsoft.com/en-us/xamarin/xamarin-forms/platform/device 是的,我的代码只是展示了 timer 的基本用法。 我想说的是你可以先使用Device.StartTimer
。
“所以你应该先调用它” - 我不知道你在这里想说什么。同样,您的评论“您可以首先使用 Device.StartTimer”。 “事先的”? “第一”?这些暗示在做其他事情之前。您之前“可以使用 Device.StartTimer”的“其他东西”是什么?我不明白你的回答在说什么。以上是关于Xamarin.Forms 中的 Device.StartTimer 与 System.Threading.Timer [关闭]的主要内容,如果未能解决你的问题,请参考以下文章