开发者

Garbage collection of C# object declared in constructor

开发者 https://www.devze.com 2023-04-01 18:11 出处:网络
In the following code, I create a DispatcherTimer in the class\'s constructor. No one keeps reference on it.

In the following code, I create a DispatcherTimer in the class's constructor. No one keeps reference on it.

In my understanding, the timer should be reclaimed by the garbage collector some time after leaving the constructor's scope. But that doesn't happen! Even after forcing a garbage collection with GC.Collect()

What is going on under the hood?

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        new DispatcherTimer
        {
            Int开发者_运维百科erval = TimeSpan.FromMilliseconds(100),
            IsEnabled = true
        }
        .Tick += (s, e) =>
        {
            textBlock1.Text = DateTime.Now.ToString();
        };
    }
}


Timers are rather special since they root themselves by calling

this.timerRoot = GCHandle.Alloc(this);

some links

  • Timer, event and garbage collection : am I missing something?
  • Event handler and memory leaks
  • http://blogs.msdn.com/b/abhinaba/archive/2009/05/05/memory-leak-via-event-handlers.aspx

EDIT:

Didn't realize that it was a DispatcherTimer - that doesn't root itself directly but indirectly (to the Dispatcher) which in turn leads to the same effect...


When you just construct the a DispatcherTimer, nothing prevents it from be GCed. However, you set IsEnabled = true, which will call Start() on the timer. When that, happens, this line of code will be executed:

this._dispatcher.AddTimer(this);

And now the Dispatcher itself is rooting the timer, meaning it can't be GCed.


It will be added to the Dispatcher queue which will be rooted.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号