使用System.Timers和Sysem.Json进行Xamarin表单错误

时间:2015-05-22 14:48:54

标签: xamarin xamarin.ios xamarin-forms

我想在基于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参考不同?

2 个答案:

答案 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(); }
}