¿Se puede recolectar un objeto que contiene un temporizador activo (System.Timers.Timer
), si ningún otro objeto lo está haciendo referencia?¿El objeto Do Timer obtiene GC-ed cuando ningún otro objeto los referencia?
Respuesta
Hay dos maneras básicas que un temporizador se mantiene incluso si se le haga referencia no almacena una referencia alguna parte:
Mientras el temporizador está activada. Hay un System.Threading subyacente.Timer que realmente genera el evento. El CLR mantiene una lista de temporizadores activos, el objeto de delegado de devolución de llamada mantiene el temporizador al que se hace referencia.
Por el controlador de eventos transcurrido, si no es estático. Eso extiende la vida útil de la instancia de Timer a al menos la duración del objeto de clase que contiene el controlador de eventos de Elapsed.
No hay modo de falla aquí. La única forma posible de obtener una referencia para el temporizador es a través del argumento del controlador de eventos transcurrido argumento. Si desactiva el temporizador, entonces ya no hay forma de obtener una referencia, por lo que es apropiado que el objeto se recopile.
Una forma bastante clásica de tener problemas con este temporizador y perder eventos transcurridos es cuando la propiedad AutoReset se establece en falsa. Un problema muy desagradable es que cualquier excepción planteada en el controlador de eventos transcurrido se traga sin ningún diagnóstico. Lo cual evitará la llamada, tendrías que reiniciar el temporizador al final. Haga favor System.Threading.Timer, no tiene este problema.
Sí. Timer
se GC'd si no se hace referencia, incluso mientras se ejecuta.
El documentation dice:
El código contiene declaraciones de la variable contador de tiempo a nivel de clase y en el interior principal. Para ver cómo la recolección de basura agresiva puede afectar un temporizador que se declara dentro de un método de larga ejecución, puede comentar la declaración de nivel de clase y descomentar la variable local. Para evitar que se recopile el temporizador, elimine el comentario del método GC.KeepAlive al final de Main.
No, esto se corrigió en .NET 2.0. Intentalo. –
Luego los documentos necesitan reparación: http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx es aproximadamente 4.5 –
- 1. Notificar Un objeto cuando una propiedad de otro objeto cambia
- 2. Obtiene objeto por id()?
- 3. ¿Cómo se obtiene la "referencia de objeto" de un objeto en java cuando toString() y hashCode() se han anulado?
- 4. Obtiene un atributo de objeto
- 5. Objeto Javascript Obtiene código como cadena
- 6. Copiar objeto en otro
- 7. Crear nuevo objeto EF con referencia de clave externa sin cargar todo el objeto de referencia
- 8. ¿Construye el objeto consigo mismo como referencia?
- 9. Obtiene nETBIOSName de un objeto UserPrincipal
- 10. Crear un objeto basado en el estado de otro objeto en Java
- 11. ¿Cómo se obtiene una referencia a un objeto TQuery creado en una declaración WITH?
- 12. Crear referencia al nuevo objeto
- 13. ¿Por qué este código obtiene este objeto 'str' no tiene ningún atributo 'get_match_routes' error?
- 14. Python Regex "el objeto no tiene ningún atributo"
- 15. Enlace de datos entre ningún objeto GUI,
- 16. .net, ¿obtiene un objeto de transacción?
- 17. variable de referencia en el objeto literal?
- 18. Referencia no definida para boost :: timer :: auto_cpu_timer
- 19. Obtiene documento objeto de un elemento secundario
- 20. Backbone - objeto rinda ha ningún método 'aplicar'
- 21. Obtiene objeto de redis sin eval?
- 22. Obtiene el objeto HttpServletRequest (solicitud) desde el código de Java
- 23. Obtiene el elemento/objeto donde se coloca el elemento
- 24. objeto no tiene ningún atributo 'guardar' Django
- 25. .NET: ¿Cómo se obtiene el tipo de objeto nulo?
- 26. Establecer un objeto igual a otro objeto con el operador de asignación en Javascript
- 27. Symfony2: ¿objeto de referencia similar al objeto de solicitud?
- 28. Llamar a Django guardar en un objeto QuerySet - El objeto 'QuerySet' no tiene ningún atributo 'guardar'
- 29. ¿Cómo puedo añadir javascript objeto a otro objeto en dinámica
- 30. Obtiene el tipo real de un parámetro de objeto genérico
+1. ¿Sabes por qué un 'System.Threading.Timer' sin referencias puede ser 'GC'ed pero no' System.Timers.Timer'? –
@Stephen, no estoy seguro de lo que quiere decir. Las mismas reglas, lista de temporizadores activos dentro del CLR, la devolución de llamada hace referencia al objeto de destino. Y un System.Timers.Timer * no recuperado * puede * ser recolectado si no está habilitado. –
Mi 'Temporizador.Threading.Timer' periódico no referenciado está GCed, pero no es mi referencia, auto-reset 'System.Timers.Timer'. El controlador de eventos no hace referencia al temporizador. ¿Puedes confirmar? (.NET 4.0 Client) –