Xamarin使用System.Timers和Sysem.Json形式错误
问题描述:
我想在我的基于Xamarin Forms的项目中使用System.Timer。我实际上将我的Xamarin iOS项目转换为Xamarin Formbased项目。我Xamarin的iOS项目有使用System.TimerXamarin使用System.Timers和Sysem.Json形式错误
aTimer = new Timer (tm);
// Hook up the Elapsed event for the timer.
aTimer.Elapsed += new ElapsedEventHandler (OnTimedEvent);
aTimer.Enabled = true;
aTimer.Start();
当我尝试使用Xamarin形式相同的代码工程中,给错误定时器所有代码。首先
using System.Timers;
它说:类型或命名空间名称定时器不存在于命名空间系统中。您是否缺少装配参考?
Xamarin iOS系统与Xamarin Forms系统参考不同吗?
答
PCL项目不支持System.Timer。
Xamarin形式有一个内置的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;
};
答
Xamarin Forms库是可移植的类库,因此定时器不是某些目标平台组合的API的一部分。
A 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(); }
}
我有两个按钮1 - 开始计时器和2 - 停止计时器。考虑到上面的代码,我如何启动和停止按钮单击计时器。在上面的代码中,它具有分配新实例的新TimeSpan(0,0,60)。如何在STOP按钮单击时返回FALSE。 – User382
看到我上面的编辑 – Jason