使用 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

System.Timers.Timer 和夏令时

System.Timers.Timer

System.Timers.Timer 严重不准确