【问题标题】:Will the .NET GC mess with an abandoned object executing a method asynchronously?.NET GC 会与异步执行方法的废弃对象混淆吗?
【发布时间】:2009-05-14 15:19:14
【问题描述】:

在 .Net 中,假设我实例化了一个启动异步进程的对象(在其方法之一上使用 Delegate.BeginInvoke),然后通过将对象的引用设置为 null 或允许它超出范围来放弃该对象。垃圾收集器会在异步过程进行时尝试收集对象吗?如果不是,是什么阻止它收集对象?

【问题讨论】:

    标签: .net asynchronous garbage-collection


    【解决方案1】:

    如果您处于完全托管的代码中,则不会收集。

    您要触发的委托是对象的一部分(根据您的描述)。只要它在运行,就会有对该对象的活动引用。一旦委托完成,该对象将成为收集的候选对象。

    但是,如果您在委托中调用本机代码,则在某些情况下,对象实际上可以在本机代码完成之前完成。详情请见MSDN forum thread。

    【讨论】:

    • 太好了,完全有道理。不过,我现在需要对此进行一些扩展。我已将 AsyncCallback 传递给 BeginInvoke,以便我可以进行一些最终处理并在异步过程完成时调用 EndInvoke。直到此 AsyncCallback 完成后,委托调用才完成吗?因此,直到 AsyncCallback 结束后,该对象才会成为收集的候选对象?
    • 是的。请参阅msdn.microsoft.com/en-us/library/… - 在 AsyncDelegate 属性中有一个代表您的委托以及您的对象的句柄。在您的回调结束之前,这不会是 GC 的候选对象。
    猜你喜欢
    • 2014-07-14
    • 1970-01-01
    • 2011-03-04
    • 2018-04-29
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多