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?
5
A
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.
Cuestiones relacionadas
- 1. Contando el número de GC limpiadas en un objeto
- 2. Escribir en un archivo de forma asíncrona
- 3. Hacer un método de extensión asíncrona
- 4. ¿La forma más rápida de ejecutar un método de forma asíncrona?
- 5. ¿Cómo funciona Object.GetHashCode cuando el GC mueve un objeto?
- 6. Criando eventos de forma asíncrona
- 7. Descargar pdf de forma asíncrona
- 8. Cómo llamar a cualquier método de forma asíncrona en C#
- 9. ¿Alguna forma de determinar qué objeto llamó un método?
- 10. ¿Cómo se usa HttpWebRequest (.NET) de forma asíncrona?
- 11. Java GC Pregunta: ¿Cómo podría un objeto llegar a ser inalcanzable mientras uno de sus métodos todavía se está ejecutando?
- 12. Averigüe el tamaño de un objeto .net
- 13. ¿Cómo puedo monitorizar de forma asíncrona un archivo en Perl?
- 14. ¿Cómo vaciar de forma asíncrona un archivo mapeado en memoria?
- 15. Hacer múltiples solicitudes HTTP de forma asíncrona
- 16. ¿cómo elimino/gc un objeto en Actionscript 3?
- 17. Invocación de un método en un objeto
- 18. ¿Fijar un objeto en el LOH afecta el rendimiento del GC?
- 19. ¿Cómo obtengo el objeto Método para un método?
- 20. .NET: deshacerse de un objeto HashAlgorithm
- 21. Comunicación TCP asíncrona en .NET
- 22. apropiante un hilo que se está ejecutando sincronizado método
- 23. abandonado mutex excepción
- 24. ¿Hay alguna manera de obtener el tamaño de un archivo en .NET usando un método estático?
- 25. ¿Estoy llamando a un objeto .NET o un objeto COM?
- 26. Implementando un sondeo largo de manera asíncrona
- 27. Adjuntar metainformación a un objeto en .NET
- 28. Mantener el objeto en intento de destrucción de GC
- 29. ¿Cómo puedo tomar posesión de un boost abandonado :: interprocess :: interprocess_mutex?
- 30. .net, ¿obtiene un objeto de transacción?
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? –
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. –
Perfecto, muy apreciado. –