Xamarin.iOS 中的 NSTimer 与计时器 - 何时使用什么

本文关键字:何时使 什么 计时器 iOS 中的 NSTimer Xamarin | 更新日期: 2023-09-27 18:34:34

是否有规则何时使用本机NSTimer与.NET替代方案?

  • System.Windows.Forms.Timer
  • 系统.定时器
  • .定时器
  • 系统线程.计时器

Xamarin.iOS 中的 NSTimer 与计时器 - 何时使用什么

如果您的目标是可移植性,我会使用.NET计时器(见下文(,除非您没有其他选择(例如方法调用的NSTimer参数(。

不幸的是,我一直以来最喜欢的计时器没有列在您的问题中,是 Task 类提供的计时器:

await Task.Delay (20);
//do something after the delay

用法非常简单。因此,代替此Timer代码:

void f() {
    var timer = new Timer(2000);
    timer.Elapsed += OnTimerElapsed;
    timer.Start ();
    Console.WriteLine ("Timer started, control is back here");
}
void OnTimerElasped (object o, EventArgs e)
{
    Console.WriteLine ("tick");
}

您可以使用它:

void f() {
    StartTimer ();
    Console.WriteLine ("Timer started, control is back here");
}
async void StartTimer ()
{
    while (true) {
        await Task.Delay (2000);
        Console.WriteLine ("tick");
    }
}

或者,如果您想要单次执行:

async void StartTimer ()
{
    await Task.Delay (2000);
    Console.WriteLine ("tick");
}

这是一个真正的好处,因为您不需要将计时器保留为实例变量,只是为了能够.Stop()它。

我发现这种形式更加精简。就像我们几年前驳回了goto声明一样(GOTO没有死。它与猫王和乔·达辛一起在岛上(,是时候考虑我们的回调过度使用了。

我建议使用NSTimer。

Xamarin 5.10:

var sampleTimer = NSTimer.CreateRepeatingScheduledTimer (TimeSpan.FromSeconds (5.0), delegate {
    //Write Action Here
                }); 

并添加一行以启动计时器!

sampleTimer.Fire();

使用后停止:

    sampleTimer.Invalidate ();
    sampleTimer.Dispose ();
    sampleTimer = null;

IMO 的主要规则是,每当某些类型(或方法(在 .NET 和当前正在使用的平台之间提供重复的功能时,都必须考虑应用程序的长期跨平台目标和特定代码(重用(。

使用 NSTimer 的 IOW 代码仅适用于 iOS 和 OSX。使用.NET计时器可以在Windows,Android上工作,当然还有iOS和OSX。

一些答案建议使用 .net 计时器来实现跨平台目标。但问题是Timer类在某些 PCL 配置文件中不可用(至少是 Xamarin 使用的配置文件(。在这些情况下,解决方法涉及按照@stephane-delcroix的建议使用Task.Delay()。我甚至为此创建了一个PclTimer实用程序类。

但。。。

我发现了Task.Delay()无法在iOS上正常工作的情况。如果您尝试在后台任务中使用它:

var taskId = UIApplication.SharedApplication.BeginBackgroundTask(() => {});
// run your timer logic here with Task.Delay() 

您会发现间隔已损坏(延迟(,不遵守您在Task.Delay(interval)上设置的间隔。

在这种情况下,NSTimer.CreateRepeatingScheduledTimer()工作完全正常。

所以我会说:

  • 是否需要在后台任务中运行计时器? => 使用 NSTimer
  • 您不需要后台任务?=>使用 .NET

我同意Poupou和Stephane的观点,但我也会说"这取决于"。如果需要在公共或共享部件中实现计时器,则最好选择.Net替代方案。由于问题是关于Xamarin.iOS(不是Xamarin.Android或Xamarin.Forms(,我想添加以下未列出的(到目前为止(解决方案,它对我有用,它非常简单。

NSTimer timer = NSTimer.CreateRepeatingScheduledTimer(TimeSpan.FromSeconds(3), delegate { MyMethod(); });

它每 3 秒调用一次 MyMethod((。