使用 System.Timers 和 Sysem.Json 的 Xamarin 表单错误
Posted
技术标签:
【中文标题】使用 System.Timers 和 Sysem.Json 的 Xamarin 表单错误【英文标题】:Xamarin Forms error using System.Timers and Sysem.Json 【发布时间】:2015-11-18 10:34:23 【问题描述】:我想在基于 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 参考?
【问题讨论】:
【参考方案1】: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 - 启动计时器和 2 - 停止计时器。考虑到上面的代码,我如何在按钮点击时启动和停止计时器。在上面的代码中,它具有分配新实例的新 TimeSpan (0, 0, 60)。如何在点击 STOP 按钮时返回 FALSE。 有用链接:Xamarin Forms Timer, Device.StartTimer async【参考方案2】: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();
【讨论】:
以上是关于使用 System.Timers 和 Sysem.Json 的 Xamarin 表单错误的主要内容,如果未能解决你的问题,请参考以下文章
为啥 xmlignore 不能与 System.Timers.Timer 类一起使用
使用System.Timers.Timer类实现程序定时执行
如何在 C# 中创建计时器而不使用 System.Timers.Timer 或 System.Threading.Timer