2014-01-16 5 views
9

Я создаю кросс-платформенные приложения с Xamarin и MvvmCross. Мне нужно каждую минуту называть сервер обновлениями (я буду пересылать уведомления позже), но я не могу сделать таймер в своем основном проекте. Я видел MvvmCross N + 42, но я считаю, что целевые проекты старше, что позволяет таймеру. Ниже приведена моя целевая структура.PCL .NET 4.5 Timer

Есть ли лучший способ для меня постоянно звонить методу, который вызывает услугу?

  • .NET Framework 4.5 и более поздних версий
  • приложения Windows Store (Windows 8) и выше
  • Windows Phone 8
  • Xamarin.Android
  • Xamarin.iOS
+0

Это может иметь значение: HTTP://stackoverflow.com/questions/12555049/timer-in-portable-library – Jason

+0

Спасибо, что видел этот поток, но я не могу настроить таргетинг на Windows 8.1 и выше из-за Xamarin. –

+0

Правильно, но есть обходные пути, предложенные перед упоминанием постоянного исправления в 8.1. По крайней мере, так я его прочитал. – Jason

ответ

2

Вы можете всегда делайте это самостоятельно благодаря удивлению асинхронных/ожидающих:

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

     await Task.Delay(_timerInterval); 
    } 
} 

Когда вы позвоните, не ждут его. Он будет работать в фоновом потоке, и вы можете закончить цикл, установив поле _timerRunning из другого места (или убив задачу, которая возвращается из вызова).

8

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

I'm, используя это в MvvmCross без проблем:

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

это спасло мой день !!! – WindyHen