Xamarin.iOS中的NSTimer与Timer - 何时使用什么?

Kru*_*lur 12 c# xamarin.ios xamarin

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

  • System.Windows.Forms.Timer
  • System.Timers.Timer
  • System.Threading.Timer

Ste*_*oix 21

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

遗憾的是,我的所有时间最喜欢的计时器都未列在您的问题中,是Task类提供的计时器:

await Task.Delay (20);
//do something after the delay
Run Code Online (Sandbox Code Playgroud)

用法很简单.所以代替这个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");
}
Run Code Online (Sandbox Code Playgroud)

你可以用这个:

void f() {
    StartTimer ();
    Console.WriteLine ("Timer started, control is back here");
}

async void StartTimer ()
{
    while (true) {
        await Task.Delay (2000);
        Console.WriteLine ("tick");
    }
}
Run Code Online (Sandbox Code Playgroud)

或者如果你想要一次执行:

async void StartTimer ()
{
    await Task.Delay (2000);
    Console.WriteLine ("tick");
}
Run Code Online (Sandbox Code Playgroud)

这是一个真正的好处,因为您不需要将计时器作为实例变量来保持.Stop()它.

我发现这种形式更加精简.就像我们多年前驳回goto声明一样(GOTO没有死.它与Elvis和Joe Dassin在岛上),现在是时候考虑我们的回调过度使用了.

  • 在您的示例中,有没有办法停止计时器? (2认同)

A.G*_*A.G 8

我建议使用NSTimer.

Xamarin 5.10:

var sampleTimer = NSTimer.CreateRepeatingScheduledTimer (TimeSpan.FromSeconds (5.0), delegate {

    //Write Action Here
                }); 
Run Code Online (Sandbox Code Playgroud)

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

sampleTimer.Fire();
Run Code Online (Sandbox Code Playgroud)

使用后停止:

    sampleTimer.Invalidate ();
    sampleTimer.Dispose ();
    sampleTimer = null;
Run Code Online (Sandbox Code Playgroud)


pou*_*pou 6

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

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