Wenn Sie ein Timer
oder ein Thread
, die für die gesamte Laufzeit des Programms führen Sie einfach tun Sie ihnen einen Verweis zu halten brauchen, um sie zu verhindern, dass Müll gesammelt werden?Können Timer automatisch Müll gesammelt werden?
Bitte vergessen Sie nicht, dass das folgende Programm timer
als statische Variable in der Klasse haben könnte, dies ist nur ein Spielzeugbeispiel, um das Problem zu zeigen.
public class Program
{
static void Main(string[] args)
{
CreateTimer();
Console.ReadLine();
}
private static void CreateTimer()
{
var program = new Program();
var timer = new Timer();
timer.Elapsed += program.TimerElapsed;
timer.Interval = 30000;
timer.AutoReset = false;
timer.Enabled = true;
}
private void TimerElapsed(object sender, ElapsedEventArgs e)
{
var timerCast = (Timer)sender;
Console.WriteLine("Timer fired at in thread {0}", GetCurrentThreadId());
timerCast.Enabled = true;
}
~Program()
{
Console.WriteLine("Program Finalized");
}
[DllImport("kernel32.dll")]
static extern uint GetCurrentThreadId();
}
Kann der Timer in diesem obigen Beispiel gesammelt werden? Ich lief es für eine Weile und ich bekam nie eine Ausnahme noch eine Nachricht, die ~Program()
genannt wurde.
UPDATE: fand ich von this question aus (thanks sethcran), die Fäden von der CLR verfolgt werden, aber ich würde immer noch eine Antwort über Timer mögen.
Welchen 'Timer'-Typ verwenden Sie hier? WinForms, Threading, etc ... – JaredPar
@JaredPar Irgendwelche von ihnen (aber ich habe 'System.Timers' im obigen Beispiel benutzt). Ich bin auch neugierig, ob ich einen Verweis auf alle Threads behalten muss, die ich unter Verwendung von 'Thread' –
http: // stackoverflow erstellt habe.com/questions/9011831/new-thread-and-waste-collection – Sethcran