En el siguiente código, creo un DispatcherTimer en el constructor de la clase. Nadie guarda referencia en eso.Recolección de basura del objeto C# declarado en el constructor
En mi entender, el recolector de basura debe recuperar el temporizador poco tiempo después de abandonar el alcance del constructor. ¡Pero eso no sucede! Incluso después de forzar una recolección de basura con GC.Collect()
¿Qué está pasando debajo del capó?
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
new DispatcherTimer
{
Interval = TimeSpan.FromMilliseconds(100),
IsEnabled = true
}
.Tick += (s, e) =>
{
textBlock1.Text = DateTime.Now.ToString();
};
}
}
Esto está realmente mal ... es un tipo diferente de temporizador. – dlev
¿Están DispatcherTimers sujetos a las mismas reglas de recolección de basura que Threading.Timers? Si es así, no tener una referencia de campo (solo una referencia local) para el temporizador causaría la recolección de basura en sí misma ... pero no creo que ese sea el caso con DispatcherTimers ... – Jeff
@ JeffN825 Todos los objetos están sujetos a las mismas reglas de GC: si eres inalcanzable desde una raíz de GC, entonces eres elegible para GC. En este caso, ese código no es ni siquiera * desde * la clase de temporizador correcta. – dlev