Toon posts:

[.Net] Thread stopt automatisch

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een simpele applicatie die een teller toont in een textbox. Omdat de app ook andere dingen moet kunnen doen, loopt de teller in een eigen thread. Maar jammergenoeg stopt deze thread er op een gegeven moment automatisch mee (na een minuut of 10).
Ik heb alleen geen idee waarom die er automatisch mee stopt. Iemand die al tegen zoiets is aangelopen? (Ik heb met google gezocht, maar geen oplossing gevonden)


C#:
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public partial class Form1 : Form
{
   public delegate void dlgSchrijfTekst(String myString);
   public dlgSchrijfTekst myDelegate;

   private int teller = 0;

   public Form1()
   {
      InitializeComponent();

      myDelegate = new dlgSchrijfTekst(SchrijfTekst);

      Thread t = new Thread(new ThreadStart(DoeIets));
      t.Start();
   }



   private void DoeIets()
   {
      AutoResetEvent autoEvent = new AutoResetEvent(true);

      // Create the delegate that invokes methods for the timer.
      TimerCallback timerDelegate = new TimerCallback(PrintTeller);

      Timer stateTimer = new Timer(timerDelegate, autoEvent, 0, 1000);
   }



   private void PrintTeller(Object stateInfo)
   {
      teller++;

      this.Invoke(
         this.myDelegate,
         new Object[] { teller.ToString() });
   }



   private void SchrijfTekst(string text)
   {
      this.txtVerdienstenTotaal.Text = text;
   }
}

Verwijderd

Je start nu een thread, waarin je een timer met callback aanmaakt. Direct daarna returned de functie waarin je dat doet en is er dus geen thread meer.

De constructie zoals je die nu hebt is dus feitelijk fout en je hebt helemaal geen thread nodig om dit op deze manier te doen. Als je de timer + callback aanmaakt in je mail thread zal het ook allemaal goed werken.

Ik vermoed dat na een minuut of 10 je (niet meer gebruikte, want de thread die 'm aanmaakte bestaat niet) timer object gewoon door de garbage collector wordt meegenomen.

Verwijderd

Topicstarter
Verwijderd schreef op maandag 03 juli 2006 @ 10:56:
Je start nu een thread, waarin je een timer met callback aanmaakt. Direct daarna returned de functie waarin je dat doet en is er dus geen thread meer.

De constructie zoals je die nu hebt is dus feitelijk fout en je hebt helemaal geen thread nodig om dit op deze manier te doen. Als je de timer + callback aanmaakt in je mail thread zal het ook allemaal goed werken.

Ik vermoed dat na een minuut of 10 je (niet meer gebruikte, want de thread die 'm aanmaakte bestaat niet) timer object gewoon door de garbage collector wordt meegenomen.
Hmm, je hebt helemaal gelijk dat het ook lukt als ik de timer in de main functie aanmaak (zonder eigen thread dus). Ook dan kan ik nog netjes allemaal andere acties uitvoeren terwijl de timer door blijft lopen. (Even afwachten hoelang de timer blifjt leven)

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

objecten in .NET bestaan zo lang er een referentie naar is (aka, jouw code weet dat het bestaat)

in de code in je start, bestaat jouw timer (stateTimer) tot regel 28, want daarna verlaat je de functie en verlies je alle referenties ernaar.

om je object langer te laten bestaan, zou je er voor kunnen kiezen om het een member van je class te maken, dan bestaat het object zo lang als je class bestaat, of (beide slechtere oplossingen)
- je maakt een static class, met daarin je static timer (dan wordt het soort van global)
- je forceert de GC om jouw object te laten leven (System.GC.KeepAlive of System.GC.SuppressFinalize)

-niks-