在Xamarin.Forms中,Device.StartTimer和System.Threading.Timer有什么区别?

5
Device.StartTimerSystem.Threading.Timer两者使用后台线程,都能跨平台并与netstandard2兼容。 System.Threading.Timer的优点是非Xamarin特定。应该在何时选择哪种方法?使用Device.StartTimer可使用原生API。根据github.com/monoSystem.Threading.Timer似乎使用专用线程来管理所有计时器。我是正确的吗,或者Xamarin使用另一种实现?

2
另外,有一个被赞和非常有用的问题,关于如何在 System.Threading.TimerSystem.Timers.Timer 之间进行选择。https://dev59.com/uXM_5IYBdhLWcg3wWRoF - Leotsarev
2个回答

8

来自Xamarin文档团队的官方答案:

https://github.com/MicrosoftDocs/xamarin-docs/issues/2243#issuecomment-543608668

两者都可以使用。

Device.StartTimer是在.NET Standard出现之前实现的,在那个时候,计时器类对于PCL项目不可用。现在计时器类可用了,所以没有必要使用Device.StartTimer。但是那个API不会消失,因为仍有旧的项目依赖它。


1
使用 Device.StartTimerSystem.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);
}

1
文档说得不一样: 如果计时器内的代码与用户界面进行交互(例如设置标签的文本或显示警报),则应在BeginInvokeOnMainThread表达式中完成(请参见下文)。 https://learn.microsoft.com/en-us/xamarin/xamarin-forms/platform/device - Leotsarev
是的,我的代码只是展示了计时器的基本用法。 - Lucas Zhang
我想说的是,你可以首先使用 Device.StartTimer - Lucas Zhang
所以你应该先调用它。我不知道你在这里想表达什么。同样,你的评论“你可以首先使用Device.StartTimer”。 “prior”?“firstly”?这意味着在做其他事情之前。你“可以使用Device.StartTimer”在做什么其他事情之前?我不明白你的答案在说什么。 - ToolmakerSteve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,