2015-06-29 2 views
6

Я создаю приложение для перекрестной платформы Xamarin, ориентированное на IOS Android и Windows Phone 8.1 с использованием .Net 4.5.1. Когда я пытаюсь ссылаться на System.Timers в проекте PCL, его там нет. Как это исправить?System.Timer отсутствует в Xamarin PCL

+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 -in-portable-class-library – 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'. В настоящий момент он циклически округляет каждую 'second'' (Task.Delay (1000))', тогда каждая 'секунда' сравнивает свое значение с' WaitTime', чтобы увидеть, нужно ли ему запускать событие «TimerElapsed» – user1

+0

'await Task.Delay (1000); секунды ++; OnTimerElapsed(); ' Это будет правильный рефактор? (Я проверю это, но я не могу сейчас) – AR89

Смежные вопросы