2015-06-29 67 views
6

我正在使用.Net 4.5.1構建一個針對iOS Android和Windows Phone 8.1的Xamarin跨平臺應用程序。當我嘗試在PCL項目中引用System.Timers時,它不在那裏。我該如何解決?Xamarin PCL缺少的System.Timer

+0

這種「行爲」比賽和遵循什麼是4.5.1便攜式實際可用。我相信它現在在4.5.2,但是現在在Xamarin/iOS-Andriod上沒有幫助。查看詳情:http://stackoverflow.com/questions/12555049/timer-in-portable-library – SushiHangover

+1

Xamarin在他們的論壇上也進行了討論和回覆:http://forums.xamarin.com/discussion/17227/timer在便攜式類庫 – SushiHangover

回答

11

您可以使用:Device.StartTimer

語法:

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

例子:增量數,每1秒1分鐘

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

}); 

例子:等待5秒鐘運行功能一次

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

** Device.StartTimer **只是** Xamarin.Forms **的一部分,它與Xamarin Native Development的可移植類庫**或**共享庫**不兼容 –

5

我前幾天注意到了這一點。儘管該課程在API文檔System.Threading.Timer Class ..Annoying中。

無論如何,我創建了自己的Timer類,使用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

'等待Task.Delay(1000);'。爲什麼1000而不是WaitTime? – AR89

+0

@ AR89好點,它可以重構使用'WaitTime'。此刻,它循環每個「秒」(Task.Delay(1000))'',然後每'秒'將其值與'WaitTime'比較是否需要觸發TimerElapsed事件 – user1

+0

'等待Task.Delay (1000); 秒++; OnTimerElapsed();' 這將是一個正確的重構? (我會測試它,但現在我不能) – AR89