使用 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(); }
}