Xamarin.iOS 中的 NSTimer 与计时器 - 何时使用什么
本文关键字:何时使 什么 计时器 iOS 中的 NSTimer Xamarin | 更新日期: 2023-09-27 18:34:34
是否有规则何时使用本机NSTimer
与.NET替代方案?
- System.Windows.Forms.Timer 系统.定时器
- .定时器
- 系统线程.计时器
如果您的目标是可移植性,我会使用.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((。