我想在基于Xamarin Forms的项目中使用System.Timer。我实际上将我的Xamarin iOS项目转换为Xamarin Formbased项目。我的Xamarin iOS项目包含使用System.Timer
的Timer的所有代码 aTimer = new Timer (tm);
// Hook up the Elapsed event for the timer.
aTimer.Elapsed += new ElapsedEventHandler (OnTimedEvent);
aTimer.Enabled = true;
aTimer.Start ();
当我尝试在Xamarin Forms项目中使用相同的代码时,它给出了错误。首先
using System.Timers;
它说:命名空间System中不存在类型或命名空间名称Timers。你错过了装配参考吗?
Xamarin iOS系统是否与Xamarin Forms System参考不同?
答案 0 :(得分:7)
PCL项目不支持System.Timer。
Xamarin Forms内置Timer以帮助解决此限制
Device.StartTimer (new TimeSpan (0, 0, 60), () => {
// do something every 60 seconds
return true; // runs again, or false to stop
});
如果您想通过按钮启动和停止计时器,您可以执行以下操作:
bool timerStatus = false;
btnStart.Clicked += delegate {
timerStatus = true;
Device.StartTimer (new TimeSpan(h,m,x), () => {
if (timerStatus) {
// do work
}
return timerStatus;
});
};
btnStop.Clicked += delegate {
timerStatus = false;
};
答案 1 :(得分:0)
Xamarin Forms库是可移植类库,因此,定时器不是某些目标平台组合的API的一部分。
一段时间的good implementation替换将是使用Task.Delay
的实现,标记为内部以避免在具有可用计时器的平台上使用PCL库时出现问题。您可以将此代码用作嵌入式垫片(来源:上面的链接):
internal delegate void TimerCallback(object state);
internal sealed class Timer : CancellationTokenSource, IDisposable
{
internal Timer(TimerCallback callback, object state, int dueTime, int period)
{
Contract.Assert(period == -1, "This stub implementation only supports dueTime.");
Task.Delay(dueTime, Token).ContinueWith((t, s) =>
{
var tuple = (Tuple<TimerCallback, object>)s;
tuple.Item1(tuple.Item2);
}, Tuple.Create(callback, state), CancellationToken.None,
TaskContinuationOptions.ExecuteSynchronously | TaskContinuationOptions.OnlyOnRanToCompletion,
TaskScheduler.Default);
}
public new void Dispose() { base.Cancel(); }
}