Ich habe den folgenden Code (aus Gründen der Lesbarkeit gekürzt):
Hauptklasse:
public StartProcess()
{
Thinker th = new Thinker();
th.DoneThinking += new Thinker.ProcessingFinished(ThinkerFinished);
th.StartThinking();
}
void ThinkerFinished()
{
Console.WriteLine("Thinker finished");
}
Klasse der Denker:
public class Thinker
{
private System.Timers.Timer t;
public delegate void ProcessingFinished();
public event ProcessingFinished DoneThinking;
BackgroundWorker backgroundThread;
public Thinker() { }
public StartThinking()
{
t = new System.Timers.Timer(5000); // 5 second timer
t.AutoReset = false;
t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
t.Start();
// start a background thread to do the thinking
backgroundThread = new BackgroundWorker();
backgroundThread.DoWork += new DoWorkEventHandler(BgThread_DoWork);
backgroundThread.RunWorkerAsync();
}
void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
DoneThinking();
}
BgThread_DoWork(object sender, DoWorkEventArgs e)
{
// work in here should go for much less than 5 seconds
// it will die if it doesn't
t.Stop();
DoneThinking();
}
}
Ursprünglich hatte ich erwartet, dass der Event-Handler in der Hauptklasse verhindern würde, dass der Thinker in den Müll wandert.
Offensichtlich ist dies nicht der Fall .
Ich frage mich nun, ob die Garbage Collection unabhängig davon durchgeführt wird, ob dieser Thread "beschäftigt" ist oder nicht. Mit anderen Worten, besteht die Möglichkeit, dass der Thread vor Ablauf der 5-Sekunden-Zeitüberschreitung gelöscht wird?
Anders gefragt: Ist es möglich, dass der Garbage Collector meinen Thinker einsammelt, bevor er fertig verarbeitet ist?