c# – 垃圾收集跨越AppDomain边界的对象

当您将从MarshalByRefObject继承的对象传递给另一个AppDomain时,由创建它的AppDomain引发的GC.Collect()不会收集该对象,前提是该对象在GC.Collect时间内未在任一AppDomain中生根( )叫?

[当我说没有根源时,我的意思是没有开发人员编写代码可以访问它.]

似乎对象没有被收集,而是被提升到下一代!

但是,如果我停止将对象传递给diff AppDomain,它将按预期收集.

这种行为是设计的吗?如果这样理由?

多谢你们,

附:我知道代码中的GC.Collect()有很多原因,我只是想了解GC将如何发生在MBRO上.

最佳答案 正如您所提到的,MBRO对象很难跟踪gc.所以MS实现了他们的行为有点不同.

这些对象有两个属性:初始生命周期(我想五分钟)和RenewOnCallTime(两分钟).如果创建了MBRO对象,则它具有初始生命周期.一旦此时间为零,则标记为gc.

对象上的每次调用都允许对象为RenewOnCallTime更长时间(如果剩余生命周期小于RenewOnCallTime).

举个例子(初始生命周期为5分钟,RenewOnCallTime为2分钟):
创建对象:生命周期为五分钟;
4分钟过去;一生只有一分钟;
打电话给对象;一生只有两分钟;
2分钟过去;
对象标记为gc,没有生命周期;

在MSDN上的某个地方有一篇很棒的文章(我现在找不到:/)

点赞