Ecco una dimostrazione interessante. Nota che dovresti eseguire questa demo compilata in modalità di rilascio o potrebbe non funzionare come pubblicizzato.
Versione 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();
}
Versione 1 sarà lieto di stampare la data e l'ora per la casella di testo una volta al secondo.
Versione 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
}
ora in versione 2, la data e l'ora verrà stampato solo una volta, perché, dopo la dichiarazione, non ci sono più riferimenti all'oggetto timer, e così l'oggetto del timer ottiene raccolto.
Questo è un esempio abbastanza forzato ma può costituire una buona dimostrazione.
Devo accreditare Jeffery Richter per questo - è nel suo eccellente libro CLR via C#
.
La perdita di tempo è l'unico inconveniente. – Dialecticus
Con "forzare la raccolta" presumo intendi chiamando GC.Collect(). Perché pensi che sarebbe pericoloso? C'è qualche documentazione che ho perso che dice così? (Capisco che la probabilità è alta, dato che non riesco a stare al passo in questi giorni.) – David
Timer stretto con requisiti in tempo reale forse? – leppie