【问题标题】:Device.StartTimer vs System.Threading.Timer in Xamarin.Forms [closed]Xamarin.Forms 中的 Device.StartTimer 与 System.Threading.Timer [关闭]
【发布时间】:2020-02-15 03:01:53
【问题描述】:

使用Device.StartTimerSystem.Threading.Timer 的优缺点是什么?

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

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

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

【问题讨论】:

标签: c# .net xamarin xamarin.forms timer


【解决方案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”的“其他东西”是什么?我不明白你的回答在说什么。
    猜你喜欢
    • 2019-04-18
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    相关资源
    最近更新 更多