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.StartTimerSystem.Threading.Timer 的优缺点是什么?

两者都在后台线程上触发,都跨平台和 netstandard2 兼容。 System.Threading.Timer 具有非 Xamarin 特定的奖励积分。

我应该使用什么以及何时使用?

Device.StartTimer 使用原生 API。 根据github.com/mono,System.Threading.Timer 似乎为所有定时器使用专用线程。我是对的,还是 Xamarin 使用其他实现?

【问题讨论】:

另外,关于如何在 System.Threading.TimerSystem.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.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);

【讨论】:

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 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

ScrollView 问题中的 Xamarin.Forms 捏手势

Xamarin.Forms 中的 EmguCV 实现

Xamarin.Forms 中的死锁

xamarin.forms 中的推送通知

Xamarin.Forms 中的全局异常处理

ReactiveUI 中的 Xamarin.Forms 控件是不是需要自定义绑定?