2011-10-01 10 views
7

Escribo una aplicación que muestra una lista del tiempo restante que tiene un usuario en un curso. Quiero que la lista se actualice dinámicamente cada segundo para que el usuario tenga una visión general completa.¿ViewModel se actualiza cada segundo?

public class ReservationCustomerList : INotifyPropertyChanged 
{ 
    public int UnitsLeft { get; set; } 
    public DateTime? OnCircuitSince { get; set; } 
    public TimeSpan? TimeLeftDate 
    { 
     get 
     { 
      if (OnCircuitSince.HasValue) 
       return TimeSpan.FromSeconds((OnCircuitSince.Value - DateTime.Now).TotalSeconds - UnitsLeft); 
      return TimeSpan.FromSeconds(UnitsLeft); 
     } 
    } 
    private void FireEverySecond() 
    { 
     PropertyChanged.Fire(this, x => x.TimeLeftDate); 
    } 
} 

Como se puede ver por encima de la idea es que el modelo sabe cuando el cliente entró en el circuito y el momento en el se han ido. Como puede ver, iam está pensando en utilizar la interfaz INotifyPropertyChanged y, en realidad, tiene un temporizador en cada modelo de vista.

Sin embargo, esta es mi preocupación. Agregar un temporizador en cada modelo de vista parece muy hinchado, ¿esta es realmente la mejor manera de lograrlo? La segunda preocupación es que si el temporizador nunca se detiene, ¿no resultaría en una pérdida de memoria ya que el temporizador nunca se detendría y mantendría vivo el modelo de vista? Si este es el caso, mi Viewmodel también necesitaría implementar IDisposable y tendría que recordar ejecutar todos los modelos de vista y deshacerse de ellos para asegurarme de que sean basura recolectada. ¿Son mis preocupaciones correctas?


Thanks.

Sí, estaba pensando en tener un servicio de temporizador para evitar tener varios temporizadores, sin embargo, tener que anular el registro de forma manual seguramente en algún momento introduciría fugas memoery.

Así que la idea con Weak Events es genial.

pensamiento Iam de hacer algo como esto:

public class TimerService 
{ 
    static Timer Timer; 
    static FastSmartWeakEvent<EventHandler> _secondEvent = new FastSmartWeakEvent<EventHandler>(); 
    static FastSmartWeakEvent<EventHandler> _minuteEvent = new FastSmartWeakEvent<EventHandler>(); 
    static DateTime LastTime; 
    public static event EventHandler SecondEvent 
    { 
     add { _secondEvent.Add(value); } 
     remove { _secondEvent.Remove(value); } 
    } 
    public static event EventHandler MinuteEvent 
    { 
     add { _minuteEvent.Add(value); } 
     remove { _minuteEvent.Remove(value); } 
    } 
    static TimerService() 
    { 
     Timer = new Timer(TimerFire, null, 1000, 1000); 
    } 
    static void TimerFire(object state) 
    { 
     _secondEvent.Raise(null, EventArgs.Empty); 
     if (LastTime.Minute != DateTime.Now.Minute) 
      _minuteEvent.Raise(null, EventArgs.Empty); 
     LastTime = DateTime.Now; 
    } 
} 

¿Tiene algún comentario? Sé que podría usar GetInstance (o IoC) singleton, sin embargo, esto lo haría más inconveniente de usar.

Iam utilizando la implementación WeakEvent que Daniel Grunwald escribió en codeproject. (da una clase muy limpia y no mucha sobrecarga). http://www.codeproject.com/KB/cs/WeakEvents.aspx

+0

Buena solución. Si está utilizando MEF o similar, es posible que desee mantener una instancia del servicio en el contenedor en lugar de utilizar métodos estáticos. Si no, entonces recomendaría convertirlo en singleton. Tener una instancia en lugar de métodos estáticos es mejor para probar. – alf

Respuesta

7

Puede tener un servicio de temporizador con un temporizador privado y un evento público, que notifica todos los modelos de vista cada segundo.

En cuanto a los problemas de memoria, puede registrar su modelo de vista con el servicio de temporizador cuando se navega su página (OnNavigatedTo) y anular el registro cuando se cierra la vista (OnNavigatedFrom). De esta forma, los viewmodels no tendrían ninguna referencia con el servicio de temporizador cuando salgan del alcance, y se recogerán correctamente.

+4

Para admitir este modelo, consulte [el artículo de MSDN sobre patrones de eventos débiles] (http://msdn.microsoft.com/en-us/library/aa970850.aspx) –

+4

. También puede usar EventAggregator desde el marco de Prism: http://msdn.microsoft.com/en-us/library/ff921122(v=pandp.20).aspx – Ucodia

Cuestiones relacionadas