2015-06-29 9 views
6

Ich erstelle eine Xamarin Cross-Plattform-App für IOS Android und Windows Phone 8.1 mit .Net 4.5.1. Wenn ich versuche, System.Timers im PCL-Projekt zu referenzieren, ist es nicht da. Wie behebe ich das?System.Timer fehlt in Xamarin PCL

+0

Diese ‚Verhalten‘ Streichhölzer und folgt dem, was in 4.5.1 tragbaren tatsächlich zur Verfügung steht. Ich glaube, es ist jetzt in 4.5.2, aber das hilft dir jetzt nicht auf Xamarin/iOS-Andriod. Siehe für Details: http://stackoverflow.com/questions/12555049/timer-in-portable-library – SushiHangover

+1

Auch diskutiert und beantwortet von Xamarin in ihren Foren: http://forums.xamarin.com/discussion/17227/timer -in-portable-class-library – SushiHangover

Antwort

11

können Sie verwenden: Device.StartTimer

Syntax:

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

Beispiele: Schrittzahl alle 1 Sekunden 1 Minute

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

}); 

Beispiele: 5 Sekunden warten Funktion auszuführen einmal

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

** Device.StartTimer ** ist nur ein Teil von ** Xamarin.Forms ** und es ist nicht kompatibel mit der ** Portable Klassenbibliothek ** von Xamarin Native Development ** oder ** Shared Library ** –

5

Das ist mir neulich aufgefallen. Obwohl die Klasse in der API-Dokumentation System.Threading.Timer Class ..Annoying ist.

Auf jeden Fall habe ich meine eigene Timer-Klasse, mit 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

'warten Task.Delay (1000);'. Warum 1000 und nicht WaitTime? – AR89

+0

@ AR89 Guter Punkt, es könnte umgestaltet werden, um 'WaitTime' zu ​​verwenden. In dem Moment, in dem es sich um jede "Sekunde" (Task.Delay (1000)) zyklisch dreht, vergleicht jede "Sekunde" ihren Wert mit "WaitTime", um zu sehen, ob es das "TimerElapsed" -Ereignis – user1

+0

'task Task.Delay auslösen muss (1000); Sekunden ++; OnTimerElapsed(); ' Dies wäre ein richtiger Refactor? (Ich werde es testen, aber ich kann jetzt nicht) – AR89

Verwandte Themen