1

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

4

2 回答 2

7

PCL 项目不支持 System.Timer。

Xamarin Forms 有一个内置的计时器来帮助解决这个限制

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;
};
于 2015-05-22T15:07:06.197 回答
0

Xamarin Forms 库是可移植类库,因此,计时器不是某些目标平台组合的 API 的一部分。

一个好的实现替代方案是使用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(); }
}
于 2015-05-22T15:29:31.023 回答