在下面的代码中,我在类的构造函数中创建一个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();
};
}
}
答案 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
队列中。