Aquí hay una demostración interesante. Tenga en cuenta que debe ejecutar esta demostración compilada en modo de lanzamiento o puede no funcionar como se anuncia.
Versión 1:
private void Button_Click(object sender, EventArgs e)
{
Timer timer = new Timer(Print, null, 0, 1000);
}
private void Print(Object o)
{
if (textBox1.InvokeRequired)
{
Action<object> action = Print;
textBox1.Invoke(action, o);
return;
}
textBox1.Text = DateTime.Now.ToString();
}
Versión 1 imprimirá felizmente la fecha y la hora a la caja de texto de una vez por segundo.
Versión 2:
private void Button_Click(object sender, EventArgs e)
{
Timer timer = new Timer(Print, null, 0, 1000);
}
private void Print(Object o)
{
if (textBox1.InvokeRequired)
{
Action<object> action = Print;
textBox1.Invoke(action, o);
return;
}
textBox1.Text = DateTime.Now.ToString();
GC.Collect(); // force a garbage collection
}
ahora en la versión 2, la fecha y la hora solamente será impreso una vez porque, después de la declaración, no hay más referencias al objeto de temporizador, por lo que el objeto de temporizador se pone recogido.
Es un ejemplo bastante artificial pero puede ser una buena demostración.
Debo acreditar a Jeffery Richter por este - está en su excelente libro CLR via C#
.
La pérdida de tiempo es el único inconveniente. – Dialecticus
Al "forzar la recopilación" supongo que quieres decir llamando a GC.Collect(). ¿Por qué crees que eso sería peligroso? ¿Hay alguna documentación que eché de menos que así lo diga? (Me doy cuenta de que la probabilidad es alta, ya que no puedo mantener el ritmo en estos días.) – David
¿Es posible que el temporizador sea apretado con requisitos en tiempo real? – leppie