System.Timers.Timer lifecycle

前端 未结 3 1514
深忆病人
深忆病人 2021-01-20 02:35

which is the right approach to use a System.Timers.Timer? I mean... I create the timer, set the interval and the method to be called on the Elapsed event.

do         


        
相关标签:
3条回答
  • 2021-01-20 03:20

    You should call t.Stop() in the Close/Unload of your form/page or anywhere you seem fit. If you leave it running, it will utilize resources unnecessarily and also you might get exceptions while closing the application.

    0 讨论(0)
  • 2021-01-20 03:22

    A short answer is you don't need to do anything. It will be collected by the Garbage Collector when function goes out of scope. If you want it available then declare it in class instead.


    Usually when you declare a timer out in class level it is collected by GC when the Class is Disposed. However when you have your timer declare in a Function then the Timer still runs but if you are executing a very long process then GC can Aggressively Dispose it so you will need to use

    GC.KeepAlive(youtimer_Instance);
    

    Have a look at the end of the Timer's Documentation for reference to this scenario.

    The Comments in the sample code says:

    
            Normally, the timer is declared at the class level,
            so that it stays in scope as long as it is needed.
            If the timer is declared in a long-running method,  
            KeepAlive must be used to prevent the JIT compiler 
            from allowing aggressive garbage collection to occur 
            before the method ends. 
    
    0 讨论(0)
  • 2021-01-20 03:27

    If you are using Timers during a long running process (e.g. a web application or a windows service), if you don't want to get a memory leak, you need to ensure that you un-subscribe from the Timer's elapsed event handler if you want the garbage collector to be able to reclaim the memory allocated for the Timer object.

    System.Timers.Timer implements IDisposable and the guidelines here are that if you have a class that implements IDisposable, any class that has a dependency on an object implementing IDisposable should implement IDisposable itself and call the objects Dispose() method when it itself is called.

    A perfect example of this is indeed with System.Timers.Timer. This uses System.Threading.Timer underneath the covers and if you look in reflector you can see the following for the Dispose method on System.Timers.Timer

    public void Dispose()
    {
        this.timerBase.Dispose();
    }
    

    Here, timerBase is simply an instance of System.Threading.Timer and therefore the Dispose call cascades down to all dependencies of the class that implement IDisposable.

    0 讨论(0)
提交回复
热议问题