Таймер будет выполнять кусок кода в некотором временном интервале. В Xamarin, каждая из платформ предоставляет свой собственный таймер, а таймер в Xamarin Forms использует их. Это не System.Threading.Timer из обычного профиля на основе PCL, однако если вы используете .NET Standard вы будете иметь доступ к System.Threading.Timer.

Далее мы рассмотрим таймер в Xamarin Forms.

Таймер в Xamarin Forms

Таймер в Xamarin Forms

Для начала, вот основной таймер, который используется в Xamarin Forms:

Device.StartTimer(TimeSpan.FromSeconds(30), () =>
{
	// что-то делаем здесь...

	return true; // True = повторить снова, False = остановить таймер
});

На уровне платформы, используются следующие реализации:

iOS

public void StartTimer(TimeSpan interval, Func<bool> callback)
{
	NSTimer timer = NSTimer.CreateRepeatingTimer(interval, t =>
	{
		if (!callback())
			t.Invalidate();
	});
	NSRunLoop.Main.AddTimer(timer, NSRunLoopMode.Common);
}

Android

public void StartTimer(TimeSpan interval, Func<bool> callback)
{
	var handler = new Handler(Looper.MainLooper);
	handler.PostDelayed(() =>
	{
		if (callback())
			StartTimer(interval, callback);

		handler.Dispose();
		handler = null;
	}, (long)interval.TotalMilliseconds);
}

UWP

public void StartTimer(TimeSpan interval, Func<bool> callback)
{
	var timer = new DispatcherTimer { Interval = interval };
	timer.Start();
	timer.Tick += (sender, args) =>
	{
		bool result = callback();
		if (!result)
			timer.Stop();
	};
}

Таймер

В то время как таймер прост в использовании, есть ряд моментов, которые необходимо учитывать при его использовании.

Жизненный цикл

Жизненный цикл таймера - это то, о чем нужно помнить. Таймер представляет собой глобальную систему синхронизации, то есть любая ссылка, которую вы помещаете в код, будет ссылаться до тех пор, пока таймер не остановится. Следовательно, вы должны поставить условие внутри таймера, чтобы остановить его, когда он больше не требуется. Невыполнение этого может привести к утечке памяти.

Многопоточность

Любой код, запущенный в таймере, будет запущен в основном потоке пользовательского интерфейса. Убедитесь, что вы не блокируете поток пользовательского интерфейса и не выполняете интенсивных вычислений. Убедитесь, что код перемещается в фоновый поток, если это необходимо.

Состояние приложения

Если ваше приложение настроено в фоновом режиме, таймер будет продолжать работать, пока он не будет по крайней мере прерван или убит.

Оригинал

Теги: xamarin forms, c#, сниппет, перевод

Редактировать