Domanda

Quando si passa un oggetto che eredita da MarshalByRefObject ad un AppDomain diverso, non sarà GC.Collect () indotta dal AppDomain che lo ha creato raccogliere l'oggetto, a condizione che l'oggetto non è radicata in entrambi AppDomain dal tempo GC .Raccogliere () chiamato?

[Quando non dico radicato voglio dire nessuno sviluppatore scritto accesso al codice più.]

Sembra che l'oggetto non è sempre raccolti, ma piuttosto sempre promosso alla prossima generazione!

Ma se mi fermo passando l'oggetto ad un diff AppDomain, è sempre raccolto come previsto.

E 'questo comportamento di progettazione? Se è così razionale?

Grazie ragazzi,

P.S. So GC.Collect () al codice è un male per molte ragioni, sto solo cercando di capire come GC avrà luogo il MBROs.

È stato utile?

Soluzione

Come lei ha ricordato MBro oggetti sono difficili da tenere traccia di per GC. Così MS implementato il loro comportamento un po 'diverso.
Questi oggetti hanno due proprietà: La loro durata iniziale (credo cinque minuti) e una RenewOnCallTime (due minuti). Se si crea un oggetto MBro che ha la sua durata iniziale. Una volta che questa volta è pari a zero si è contrassegnato per gc.
Ogni chiamata sull'oggetto consente all'oggetto di vivere per RenewOnCallTime più a lungo (se la durata residua è inferiore alla RenewOnCallTime).

Per un esempio (5 minuti vita iniziale, due minuti RenewOnCallTime):
Viene creato Oggetto: corso della vita è di cinque minuti;
4 minuti passano; Lifetime è un minuto;
Chiama per oggetto è fatto; Lifetime è di due minuti;
2 minuti passano;
Oggetto viene contrassegnato per gc, No a vita ha lasciato;

Da qualche parte su MSDN c'è una grande articolo su questo (che non riesco a trovare in questo momento: /)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top