【问题标题】:System.Timer missing from Xamarin PCLXamarin PCL 中缺少 System.Timer
【发布时间】:2015-09-15 10:20:49
【问题描述】:

我正在使用 .Net 4.5.1 构建针对 IOS Android 和 Windows Phone 8.1 的 Xamarin 跨平台应用程序。当我尝试在 PCL 项目中引用 System.Timers 时,它不存在。我该如何解决这个问题?

【问题讨论】:

标签: c# .net xamarin cross-platform


【解决方案1】:

你可以使用:Device.StartTimer

语法:

public static void StartTimer (TimeSpan interval, Func<bool> callback)

示例:每 1 秒递增一次,持续 1 分钟

int number = 0;
Device.StartTimer(TimeSpan.FromSeconds(1),() => {
    number++;
    if(number <= 60) 
    {
        return true; //continue
    }
    return false ; //not continue

});

示例:等待 5 秒运行一次函数

Device.StartTimer(TimeSpan.FromSeconds(5),() => {
    DoSomething();
    return false ; //not continue
});

【讨论】:

  • Device.StartTimer 只是 Xamarin.Forms 的一部分,它与 Xamarin Native Development 的 可移植类库共享库
【解决方案2】:

前几天我注意到了这一点。尽管该类在 API 文档中 System.Threading.Timer Class..Annoying。

无论如何,我使用Task.Delay() 创建了自己的 Timer 类:

public class Timer
{

        private int _waitTime;
        public int WaitTime
        {
            get { return _waitTime; }
            set { _waitTime = value; }
        }

        private bool _isRunning;
        public bool IsRunning
        {
            get { return _isRunning; }
            set { _isRunning = value; }
        }

        public event EventHandler Elapsed;
        protected virtual void OnTimerElapsed()
        {
            if (Elapsed != null)
            {
                Elapsed(this, new EventArgs());
            }
        }

        public Timer(int waitTime)
        {
            WaitTime = waitTime;
        }

        public async Task Start()
        {
            int seconds = 0;
            IsRunning = true;
            while (IsRunning)
            {
                if (seconds != 0 && seconds % WaitTime == 0)
                {
                    OnTimerElapsed();
                }
                await Task.Delay(1000);
                seconds++;
            }
        }

        public void Stop()
        {
            IsRunning = false;
        }
}

【讨论】:

  • await Task.Delay(1000);。为什么是 1000 而不是 WaitTime?
  • @AR89 好地方,可以重构为使用WaitTime。目前它每second(Task.Delay(1000))循环一次,然后每seconds将其值与WaitTime进行比较,看看是否需要触发TimerElapsed事件
  • await Task.Delay(1000); seconds++; OnTimerElapsed(); 这将是一个正确的重构? (我会测试它,但我现在不能)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多