计时器不包含在Xamarin.Forms的System.Threading中

时间:2015-08-17 12:10:57

标签: c# timer xamarin xamarin.android xamarin.forms

我在System.Threading.Timer中使用了Xamarin.Android

如何在Xamarin.Forms中使用同一个班级? (我想从Xamarin.Fornd中的Xamarin.Android转移我的项目)

public static System.Threading.Timer timer;
if (timer == null)
{
    System.Threading.TimerCallback tcb = MyMethod;
    timer = new System.Threading.Timer(tcb, null, 700, System.Threading.Timeout.Infinite);
}
else
{
    timer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite);
    timer.Change(700, System.Threading.Timeout.Infinite);
}

2 个答案:

答案 0 :(得分:8)

PCL代码中没有

System.Threading.Timer。 您可以使用Xamarin.Forms.Device.StartTimer方法,如下所述: http://developer.xamarin.com/api/member/Xamarin.Forms.Device.StartTimer/

答案 1 :(得分:5)

对于PCL,您可以使用async / await功能创建自己的功能。这种方法的另一个优点 - 您的计时器方法实现可以等待计时器处理程序

中的异步方法
public sealed class AsyncTimer : CancellationTokenSource
{
    public AsyncTimer (Func<Task> callback, int millisecondsDueTime, int millisecondsPeriod)
    {
        Task.Run(async () =>
        {
            await Task.Delay(millisecondsDueTime, Token);
            while (!IsCancellationRequested)
            {
                await callback();
                if (!IsCancellationRequested)
                    await Task.Delay(millisecondsPeriod, Token).ConfigureAwait(false);
            }
        });
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
            Cancel();

        base.Dispose(disposing);
    }
}

用法:

{
  ...
  var timer = new AsyncTimer(OnTimer, 0, 1000);
}

private async Task OnTimer()
{
   // Do something
   await MyMethodAsync();
}