Xamarin使用System.Timers和Sysem.Json形式错误

问题描述:

我想在我的基于Xamarin Forms的项目中使用System.Timer。我实际上将我的Xamarin iOS项目转换为Xamarin Formbased项目。我Xamarin的iOS项目有使用System.TimerXamarin使用System.Timers和Sysem.Json形式错误

aTimer = new Timer (tm); 

    // Hook up the Elapsed event for the timer. 
    aTimer.Elapsed += new ElapsedEventHandler (OnTimedEvent); 


    aTimer.Enabled = true; 
    aTimer.Start(); 

当我尝试使用Xamarin形式相同的代码工程中,给错误定时器所有代码。首先

using System.Timers; 

它说:类型或命名空间名称定时器不存在于命名空间系统中。您是否缺少装配参考?

Xamarin iOS系统与Xamarin Forms系统参考不同吗?

PCL项目不支持System.Timer。

Xamarin形式有一个内置的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; 
}; 
+0

我有两个按钮1 - 开始计时器和2 - 停止计时器。考虑到上面的代码,我如何启动和停止按钮单击计时器。在上面的代码中,它具有分配新实例的新TimeSpan(0,0,60)。如何在STOP按钮单击时返回FALSE。 – User382

+0

看到我上面的编辑 – Jason

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

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