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
Odpowiedz
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
});
** Device.StartTimer ** jest tylko częścią ** Xamarin.Forms ** i nie jest kompatybilny z ** przenośną biblioteką klasy Xamarin Native Development ** lub ** Shared library ** –
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;
}
}
'poczekaj na Task.Delay (1000);'. Dlaczego 1000, a nie WaitTime? – AR89
@ 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
'czeka na Task.Delay (1000); sekund ++; OnTimerElapsed(); ' To byłby właściwy reaktor? (Testuję to, ale nie mogę teraz) – AR89
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
Również omówione i odpowiedział przez Xamarin na ich forach: http://forums.xamarin.com/discussion/17227/timer -w przenośnej bibliotece-klasy – SushiHangover