PCL .NET 4.5计时器

时间:2014-01-16 00:25:20

标签: c# xamarin .net-4.5 mvvmcross

我正在使用Xamarin和MvvmCross构建跨平台应用程序。我需要每分钟调用服务器更新一次(稍后我将移动推送通知)但我无法在我的核心项目中制作计时器。我见过MvvmCross N + 42,但我相信目标项目较旧,允许计时器。以下是我的目标框架。

我是否有更好的方法来不断调用调用服务的方法?

  • .NET Framework 4.5及更高版本
  • Windows应用商店应用(Windows 8)及更高版本
  • Windows Phone 8
  • Xamarin.Android
  • Xamarin.iOS

2 个答案:

答案 0 :(得分:9)

@stevemorgan回答非常好。 我基于该代码创建了一个Timer实用程序,使其更具可重用性。 我还添加了一个“runOnce”参数,它将在第一次打勾后停止计时器

public class PclTimer
{
    public bool IsRunning { get; private set; }

    public TimeSpan Interval { get; set; }
    public Action Tick { get; set; }
    public bool RunOnce { get; set; }
    public Action Stopped { get; set; }
    public Action Started { get; set; }

    public PclTimer(TimeSpan interval, Action tick = null, bool runOnce = false)
    {
        Interval = interval;
        Tick = tick;
        RunOnce = runOnce;
    }

    public PclTimer Start()
    {
        if (!IsRunning)
        {
            IsRunning = true;
            Started?.Invoke();
            var t = RunTimer();
        }

        return this;
    }

    public void Stop()
    {
        IsRunning = false;
        Stopped?.Invoke();
    }

    private async Task RunTimer()
    {
        while (IsRunning)
        {
            await Task.Delay(Interval);

            if (IsRunning)
            {
                Tick?.Invoke();

                if (RunOnce)
                {
                    Stop();
                }
            }
        }
    }
}

我在MvvmCross中使用它没有任何问题:

timer = new Timer(TimeSpan.FromSeconds(4), 
            () => ShowViewModel<UserMatchViewModel>(), true)
            .Start();

答案 1 :(得分:3)

由于async / await的奇迹,你总是可以自己动手:

public async Task RunTimer()
{
    while(_timerRunning)
    {
        // Do Work
        // ...

        await Task.Delay(_timerInterval);
    }
}

当你打电话时,不要等待它。它将在后台线程上运行,您可以通过从其他地方设置_timerRunning字段来终止循环(或者通过终止从调用中返回的任务)。