2009-05-14 23 views
5

En .Net, supongamos que crea una instancia de un objeto que inicia un proceso asincrónico (usando Delegate.BeginInvoke en uno de sus métodos), luego abandona el objeto estableciendo la referencia a nulo o permitiendo que salga del ámbito. ¿El recolector de basura intentará recoger el objeto mientras el proceso asíncrono está en progreso? Si no, ¿qué impide que recoja el objeto?¿Destrozará el GC de .NET un objeto abandonado ejecutando un método de forma asíncrona?

Respuesta

12

Si tiene un código completamente administrado, no se recopilará.

El delegado que está disparando forma parte del objeto (según su descripción). Mientras se está ejecutando, hay una referencia activa al objeto. Tan pronto como el delegado finalice, el objeto se convertirá en un candidato para la recopilación.

Sin embargo, si llama al código nativo en el delegado, hay algunas situaciones en las que el objeto puede finalizarse antes de que se complete el código nativo. Para obtener más información, consulte este MSDN forum thread.

+0

Genial, tiene mucho sentido. Sin embargo, necesito expandirme un poco en esto ahora. Pasé un AsyncCallback al BeginInvoke para poder hacer un proceso de finalización y llamar a EndInvoke cuando se completa el proceso asincrónico. ¿Es cierto que la llamada del delegado no está completa hasta después de que se complete esta AsyncCallback? ¿Y así el objeto no se convertirá en un candidato para la recolección hasta después de que termine el AsyncCallback? –

+0

Sí. Consulte http://msdn.microsoft.com/en-us/library/system.runtime.remoting.messaging.asyncresult_members.aspx: hay un identificador para su delegado y, por lo tanto, su objeto en la propiedad AsyncDelegate. Hasta que finalice su devolución de llamada, esto no será candidato para GC. –

+0

Perfecto, muy apreciado. –

Cuestiones relacionadas