¿Cómo puedo cancelar desde Device.StartTimer?

Cuando uso System.Threading.Timer puedo detener mi temporizador e iniciarlo de nuevo:

protected override void OnScrollChanged(int l, int t, int oldl, int oldt) { if (timer == null) { System.Threading.TimerCallback tcb = OnScrollFinished; timer = new System.Threading.Timer(tcb, null, 700, System.Threading.Timeout.Infinite); } else { timer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite); timer.Change(700, System.Threading.Timeout.Infinite); } } 

¿Cuál es la mejor manera de detener Device.StartTimer e iniciarlo de nuevo?

Supongo que se está refiriendo a Device.StartTime en XamarinForms. La forma de detener o continuar una tarea recurrente se determina por lo que devuelve el segundo argumento:

 // run task in 2 minutes Device.StartTimer(TimeSpan.FromMinutes(2), () => { if (needsToRecur) { // returning true will fire task again in 2 minutes. return true; } // No longer need to recur. Stops firing task return false; }); 

Si desea detener temporalmente este temporizador y volver a dispararlo después de algún tiempo, deberá volver a llamar a Device.StartTimer . Sería agradable para envolver esto en su propia clase donde se puede utilizar a un miembro privado para determinar si una tarea continua todavía se está ejecutando. Algo como esto:

 public class DeviceTimer { readonly Action _Task; readonly List<TaskWrapper> _Tasks = new List<TaskWrapper>(); readonly TimeSpan _Interval; public bool IsRecurring { get; } public bool IsRunning => _Tasks.Any(t => t.IsRunning); public DeviceTimer(Action task, TimeSpan interval, bool isRecurring = false, bool start = false) { _Task = task; _interval = interval; IsRecurring = isRecurring; if (start) Start(); } public void Restart() { Stop(); Start(); } public void Start() { if (IsRunning) // Already Running return; var wrapper = new TaskWrapper(_Task, IsRecurring, true); _Tasks.Add(wrapper); Device.StartTimer(_interval, wrapper.RunTask); } public void Stop() { foreach (var task in _Tasks) task.IsRunning = false; _Tasks.Clear(); } class TaskWrapper { public bool IsRunning { get; set; } bool _IsRecurring; Action _Task; public TaskWrapper(Action task, bool isRecurring, bool isRunning) { _Task = task; _IsRecurring = isRecurring; IsRunning = isRunning; } public bool RunTask() { if (IsRunning) { _Task(); if (_IsRecurring) return true; } // No longer need to recur. Stop return IsRunning = false; } } } 
  • Cómo cambiar los colores de la forma en Drawable?
  • Atascado en Xamarin AAPT error
  • Error de construcción de la arquitectura del procesador
  • Xamarin: Error al abrir una sesión para la máquina virtual Nexus 7 (Lollipop)
  • Reproducir varias canciones con MediaPlayer al mismo tiempo: solo una está jugando
  • Visual Studio y Android Device Monitor no detectan ningún dispositivo
  • Error incluso si la aplicación parece no estar instalada
  • El botón de Android muestra diferentes mensajes de Toast dependen del número de clics
  • Xamarin C # EditText InputType Contraseña
  • El apk firmado no funciona en mi dispositivo
  • Cómo personalizar el icono de flecha, el icono de la página y el título de la página en MasterDetailPage - Xamarin.Forms
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.