如果要调用的方法被垃圾收集,Dispatcher.Invoke会发生什么?

时间:2014-10-06 16:50:07

标签: c# garbage-collection dispatcher

我有这样的代码:

var myTimer = new Timer(500);
myTimer.Elapsed += (o, a) =>
{
    Application.Current.Dispatcher.Invoke(() =>
    {
        // Handle elapsed
    }, DispatcherPriority.Render);
};

如果计时器过去并将匿名方法添加到Dispatcher,那么在调度程序调用匿名方法之前,会立即超出范围并进行垃圾收集,会发生什么?

1 个答案:

答案 0 :(得分:4)

它的生命周期不会特意结束,因为消息循环正在引用它。

即使对象不再在代码范围内,该对象也可以通过rooted对象访问,因此GC无法收集它。

使用托管内存的关键在于,当无法从可执行代码访问它们时,您可以依赖GC只回收任何托管资源。如果可执行代码可以访问对象,则不会收集该对象。