使用 System.Timers 和 Sysem.Json 的 Xamarin Forms 错误
Xamarin Forms error using System.Timers and Sysem.Json
我想在基于 Xamarin Forms 的项目中使用 System.Timer。我实际上正在将我的 Xamarin iOS 项目转换为基于 Xamarin Form 的项目。我的 Xamarin iOS 项目包含使用 System.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;
它说:类型或命名空间名称 Timers 在命名空间 System 中不存在。您是否缺少程序集参考?
Xamarin iOS 系统是否不同于 Xamarin Forms 系统引用?
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;
};
Xamarin Forms 库是可移植的 class 库,因此,定时器不是某些目标平台组合的 API 的一部分。
时间的 good implementation 替换将是使用 Task.Delay
的实现,标记为内部以避免在具有可用计时器的平台上使用 PCL 库时出现问题。您可以将此代码用作嵌入式垫片(来源:上面的 link):
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(); }
}
我想在基于 Xamarin Forms 的项目中使用 System.Timer。我实际上正在将我的 Xamarin iOS 项目转换为基于 Xamarin Form 的项目。我的 Xamarin iOS 项目包含使用 System.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;
它说:类型或命名空间名称 Timers 在命名空间 System 中不存在。您是否缺少程序集参考?
Xamarin iOS 系统是否不同于 Xamarin Forms 系统引用?
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;
};
Xamarin Forms 库是可移植的 class 库,因此,定时器不是某些目标平台组合的 API 的一部分。
时间的 good implementation 替换将是使用 Task.Delay
的实现,标记为内部以避免在具有可用计时器的平台上使用 PCL 库时出现问题。您可以将此代码用作嵌入式垫片(来源:上面的 link):
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(); }
}