Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dispose or kill DispatcherTimer object and Accessing DispatcherTimer object

Question 1: Hi, I would like to know is there a way by which I can dispose or kill the object of DispatcherTimer and create a new object of same name?

Question 2: Can I access the DispatcherTimer object in some other class if it is set to Public?

like image 361
ahmad05 Avatar asked Nov 19 '12 13:11

ahmad05


2 Answers

  1. You cannot dispose DispatcherTimer object. It doesn't implement IDisposable interface. You cannot explicit kill (free, destroy) objects in managed world. If you don't need the timer object any more, disable it and set reference to it to null. It will be collected later by GC. You can disable or stop the timer by setting IsEnabled = false or call timer.Stop(). The effect is the same.
  2. Yes. I suppose you have public property like this:

    public DispatcherTimer MyTimer { get; private set; }

like image 52
Lubo Avatar answered Oct 16 '22 12:10

Lubo


Adding to a correct answer from Lubo (and bringing up this topic from comments under it): even though you cannot dispose DispatcherTimer (most probably, because it's wired up to unmanaged part of the WPF / UWP Dispatcher itself which lives as long as the app itself), you still should unsubscribe from its events.

Say, if you had some method (StartRefreshTimer) where you initialized your DispatcherTimer and started listening to its Tick event:

private DispatcherTimer _refreshTimer = new DispatcherTimer() { Interval = TimeSpan.FromMinutes(1) };

private void StartRefreshTimer()
{
    if (_refreshTimer != null)
    {
        _refreshTimer.Tick += OnTick; // subscribe to timer's ticks
        _refreshTimer.Start(); // start timer
    }
}

private void OnTick(object sender, object args)
{
    // your custom OnTick logic
}

Then you should have a method which stops the timer and unsubscribes from its events:

private void StopRefreshTimer()
{
    if (_refreshTimer != null)
    {
        _refreshTimer.Stop(); // stop timer
        _refreshTimer.Tick -= OnTick; // unsubscribe from timer's ticks
    }
}

You should make sure you call this "tear down" method when your class goes out of scope (for example, when your WPF / UWP control or ViewModel is unloaded). If you don't unsubscribe from timer events you could end up with memory leaks caused by references from outer scope to your timer hosting class.

like image 34
Stas Ivanov Avatar answered Oct 16 '22 11:10

Stas Ivanov