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

tpo*_*pol 5 .net c# 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();
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

dle*_*lev 3

当你仅仅构造 a 时DispatcherTimer,没有什么可以阻止它被 GC 。但是,您设置IsEnabled = true,这将调用Start()计时器。当这种情况发生时,这行代码将被执行:

this._dispatcher.AddTimer(this);
Run Code Online (Sandbox Code Playgroud)

现在它Dispatcher本身正在root计时器,这意味着它不能被GC。