Kru*_*lur 12 c# xamarin.ios xamarin
是否有规则何时使用本机NSTimer
与.NET替代方案?
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在岛上),现在是时候考虑我们的回调过度使用了.
我建议使用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)
IMO的主要规则是,无论何时某些类型(或方法)在.NET和您当前正在处理的平台之间提供重复功能,您必须考虑您的应用程序和特定代码的长期跨平台目标(重用) ).
IOW代码使用NSTimer
仅适用于iOS和OSX.使用.NET计时器可以在Windows,Android,当然还有iOS和OSX上运行.