Hallo allemaal,
Ik ben nu enige tijd bezig met een C#. Heel erg mooi allemaal, maar ik heb een kleine maar toch ingewikkelde vraag.
Ik heb een class gedefinieerd. Voor iedere instantie van de class draait een thread. Een class wordt van buiten op de normale manier ge-instantieerd, dit werkt allemaal goed.
de code van de class, met een eigen thread
code van het object dat dit alles aanroept:
De garbage collector wil mijn object niet opruimen. Dit is logisch, want een instantie van Thread refereert er aan (dit kan je testen door de thread weg te commenten en de test te draaien). Hoe kan ik er nu toch voor zorgen dat de garbage collector deze instantie van het object oppikt?
Wanneer dit echt niet lukt, dan zal ik waarschijnlijk IDisposable moeten implementeren (ook geen ramp), maar als het met de garbage collector zou kunnen zou dit ook heel relaxed zijn (als iemand ooit zijn troep vergeet op te ruimen, wordt het alsnog ooit eens door de garbage collector gedaan.
Ik ben nu enige tijd bezig met een C#. Heel erg mooi allemaal, maar ik heb een kleine maar toch ingewikkelde vraag.
Ik heb een class gedefinieerd. Voor iedere instantie van de class draait een thread. Een class wordt van buiten op de normale manier ge-instantieerd, dit werkt allemaal goed.
de code van de class, met een eigen thread
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| public class BackgroundThread
{
private Thread BackThread;
public BackgroundThread()
{
Console.WriteLine("BackgroundThread: new");
this.BackThread = new Thread(new ThreadStart(this.run));
this.BackThread.IsBackground=true;
this.BackThread.Start();
}
~BackgroundThread()
{
Console.WriteLine("BackgroundThread: destroy");
this.BackThread.Abort();
}
private void run()
{
while(true)
{
Console.WriteLine(".");
Thread.Sleep(500);
}
}
} |
code van het object dat dit alles aanroept:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| static void Main(string[] args)
{
BackgroundThread myObject= new BackgroundThread();
Console.WriteLine("BackgroundThread object created");
Thread.Sleep(1000);
myObject = null;
Console.WriteLine("BackgroundThread object reference removed");
Thread.Sleep(1000);
Console.WriteLine("Calling garbage collector");
GC.Collect();
GC.WaitForPendingFinalizers();
Thread.Sleep(10000);
} |
De garbage collector wil mijn object niet opruimen. Dit is logisch, want een instantie van Thread refereert er aan (dit kan je testen door de thread weg te commenten en de test te draaien). Hoe kan ik er nu toch voor zorgen dat de garbage collector deze instantie van het object oppikt?
Wanneer dit echt niet lukt, dan zal ik waarschijnlijk IDisposable moeten implementeren (ook geen ramp), maar als het met de garbage collector zou kunnen zou dit ook heel relaxed zijn (als iemand ooit zijn troep vergeet op te ruimen, wordt het alsnog ooit eens door de garbage collector gedaan.