在构造函数中声明的C#对象的垃圾收集

时间:2011-08-31 14:15:45

标签: c# .net constructor garbage-collection

在下面的代码中,我在类的构造函数中创建一个DispatcherTimer。没有人继续参考它。

根据我的理解,在离开构造函数的范围之后,垃圾收集器应该在一段时间后回收计时器。 但这不会发生!甚至在使用GC.Collect()

强制进行垃圾回收之后

引擎盖下发生了什么?

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

        new DispatcherTimer
        {
            Interval = TimeSpan.FromMilliseconds(100),
            IsEnabled = true
        }
        .Tick += (s, e) =>
        {
            textBlock1.Text = DateTime.Now.ToString();
        };
    }
}

3 个答案:

答案 0 :(得分:4)

计时器相当特殊,因为他们通过调用

来自己
this.timerRoot = GCHandle.Alloc(this);

一些链接

修改

没有意识到这是一个DispatcherTimer - 它不是直接根源,而是间接地(到Dispatcher),这反过来导致同样的效果......

答案 1 :(得分:3)

当您构建一个DispatcherTimer时,没有任何东西阻止它被GC。但是,您设置了IsEnabled = true,它将在计时器上调用Start()。当发生这种情况时,将执行以下代码:

this._dispatcher.AddTimer(this);

现在Dispatcher本身正在为计时器生根,这意味着它无法进行GC。

答案 2 :(得分:1)

它将被添加到将被植根的Dispatcher队列中。