Timer in WPF

di il
6 risposte

Timer in WPF

Non vedo il componente Timer in WPF e uso un DispatchTimer. Sono io che non lo trovo o non esiste proprio?

6 Risposte

  • Re: Timer in WPF

    No, il componente non esiste, devi usare il DispatcherTimer, ecco un esempio:
    
    DispatcherTimer dispatcherTimer = new DispatcherTimer();
    ...
    dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
    dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
    ...
    dispatcherTimer.Start();
    
  • Re: Timer in WPF

    Ok, però non mi è chiara la sua distruzione. Non ho capito se devo fare qualcosa per segnalare che ho finito di usarlo.
  • Re: Timer in WPF

    Non puoi distruggerlo in quanto non implementa l'interfaccia IDisposable.

    Inserisci dentro dispatcherTimer_Tick, sotto la condizione da verificarsi al fine di bloccare il timer, le seguenti righe:
    dispatcherTimer.Stop();
    dispatcherTimer = null;
    Ci penserà il GC a collezionarlo per deallocarlo (forse ) dall'heap.
  • Re: Timer in WPF

    Ciao Toki

    Quello che non capisco è questo
    
    void MyFunc()
    {
      DispatcherTimer dt = new DispatcherTimer();
      dt.Tick += new EventHandler(TickFunction);
      dt.Interval = new TimeSpan(0, 0, 1);
      dt.Start();
    }
    
    Quando esco da MyFunc la variabile dt non esiste più e non c' è più nessun riferimento al timer per cui potrebbe essere distrutto dal Garbage Collector. Ma allora come fa a funzionare?
  • Re: Timer in WPF

    Ciao ragazzi,
    permettetemi di inserirmi nella discussione che si stà facendo interessante e permette un bell' approfondimento!

    In Windows Form questo sarebbe un errore:
    
    void MyFunc()
    {
      Timer timer = new System.Timers.Timer(1000);
      timer.Elapsed += new ElapsedEventHandler(timedEvent);
      timer.Interval = 2000;
      timer.Enabled = true;
    }
    
    All' uscita di MyFunc il timer potrebbe essere deallocato dal Garbage Collector, per evitarlo bisognerebbe usare:
    
    GC.KeepAlive(timer);
    
    In WPF invece la cosa è diversa e questo codice è corretto:
    
    void MyFunc()
    {
      DispatcherTimer dt = new DispatcherTimer();
      dt.Tick += new EventHandler(TickFunction);
      dt.Interval = new TimeSpan(0, 0, 1);
      dt.Start();
    }
    
    All' uscita della funzione il timer non viene deallocato. Questo perché la classe Threading.Dispatcher tiene una lista dei timer attivi, questi elementi vengono eliminati allo stop del timer. L' esistenza di questa lista impedisce al Garbage Colletor di distruggere i timer.
  • Re: Timer in WPF

    Grazie a tutti! Vi siete meritati una bella birretta!
Devi accedere o registrarti per scrivere nel forum
6 risposte