2015-06-29 24 views
6

Buduję aplikację Xamarin na różne platformy na systemy IOS Android i Windows Phone 8.1, korzystając z .Net 4.5.1. Kiedy próbuję odwołać się do System.Timers w projekcie PCL, go tam nie ma. Jak to naprawić?System.Timer brakuje w Xamarin PCL

+0

Dopasowuje „zachowania” i następuje to, co jest aktualnie dostępne w 4.5.1 przenośnego. Wierzę, że jest teraz w wersji 4.5.2, ale to nie pomaga teraz w Xamarin/iOS-Andriod. Zobacz szczegóły: http://stackoverflow.com/questions/12555049/timer-in-portable-library – SushiHangover

+1

Również omówione i odpowiedział przez Xamarin na ich forach: http://forums.xamarin.com/discussion/17227/timer -w przenośnej bibliotece-klasy – SushiHangover

Odpowiedz

11

Można użyć: Device.StartTimer

Składnia:

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

Przykłady: numer przyrost co 1 sekund do 1 minuty

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

}); 

Przykłady: odczekać 5 sekund, aby uruchomić funkcję jednorazowo

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

** Device.StartTimer ** jest tylko częścią ** Xamarin.Forms ** i nie jest kompatybilny z ** przenośną biblioteką klasy Xamarin Native Development ** lub ** Shared library ** –

5

Zauważyłem to pewnego dnia. Mimo że klasa znajduje się w dokumentacji interfejsu API System.Threading.Timer Class ..Annoying.

Zresztą tworzę własne klasy Timer, używając Task.Delay():

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; 
     } 
} 
+0

'poczekaj na Task.Delay (1000);'. Dlaczego 1000, a nie WaitTime? – AR89

+0

@ AR89 Dobre miejsce, może być refaktoryzowane, aby użyć 'WaitTime'. W tej chwili cyklicznie zaokrągla każdy "sekundę" (Task.Delay (1000)), a następnie co każde "sekundy" porównuje jego wartość z 'WaitTime', aby zobaczyć czy musi wystrzelić' TimerElapsed' zdarzenie – user1

+0

'czeka na Task.Delay (1000); sekund ++; OnTimerElapsed(); ' To byłby właściwy reaktor? (Testuję to, ale nie mogę teraz) – AR89