Question

Lorsque vous passez un objet qui hérite de MarshalByRefObject à un autre AppDomain, ne sera pas GC.Collect () induite par le AppDomain qui l'a créé recueillir l'objet, à condition que l'objet ne soit ancré dans AppDomain par le temps GC .Recueillir () appelé?

[Quand je dis que je veux dire ne s'enracine pas d'accès du code écrit de développeur plus.]

Il semble que l'objet ne se recueillir, mais plutôt se promu à la génération suivante!

Mais si je cesse de passer l'objet à une diff AppDomain, on se recueillir comme prévu.

Est-ce comportement par la conception? Si oui raison d'être?

Merci les gars,

P.S. Je sais GC.Collect () dans le code est mauvais pour de nombreuses raisons, je suis juste essayer de comprendre comment GC aurait lieu le MBROs.

Était-ce utile?

La solution

Comme vous l'avez mentionné MBro objets sont difficiles à garder une trace de la gc. Donc, MS mis en œuvre leur comportement un autre bit.
Ces objets ont deux propriétés: Leur durée de vie initiale (je pense que cinq minutes) et un RenewOnCallTime (deux minutes). Si un objet MBro est créé, il a sa durée de vie initiale. Une fois que cette fois-ci est égal à zéro, il est marqué pour gc.
Chaque appel sur l'objet permet à l'objet de vivre plus longtemps RenewOnCallTime (si la durée de vie restante est inférieure à la RenewOnCallTime).

Pour un exemple (5 minutes à vie initiale, à 2 minutes RenewOnCallTime):
L'objet est créé: Durée de vie est de cinq minutes;
4 minutes passent; Durée de vie est d'une minute;
Appel à l'objet est fait; Durée de vie est de deux minutes;
2 minutes passent;
L'objet est marqué pour gc, No Lifetime gauche;

Quelque part sur MSDN il y a un article à ce sujet (que je ne trouve pas en ce moment: /)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top