c# Thread en de thread timer

Pagina: 1
Acties:
  • 137 views sinds 30-01-2008
  • Reageer

  • TangLeFuzZ
  • Registratie: Juni 2001
  • Laatst online: 15-10 12:48
Hoi,

ik zit met een probleem icm de thread timer in c#.

Mijn doel:

Een thread elke x seconden een functie laten uitvoeren, met de mogelijkheid om dit tijdelijk stil te zetten en later verder te gaan.
Op dit moment start ik een thread, die als callback functie een functie heeft waarin een Thread Timer wordt gestart:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private void iUpdateSessionInterval = 1000;

private void Start()
{
                sessionThread = new Thread(new ThreadStart(UpdateSessionCallBack));
                sessionThread.Start();
}

private void UpdateSessionCallBack()
{
    sessionTimer = new Timer(UpdateSession, null, iUpdateSessionInterval, iUpdateSessionInterval);
}

private void UpdateSession(Object data)
{
    Debug.WriteLine("update de user sessie");
}


Zodra ik Start() aanroep, wordt de thread gestart, gaat de timer lopen en wordt elke 'iUpdateSessionInterval' sec. in de console "update de user sessie" weggeschreven.
Wat ik nu wilde, was met sessionThread.Suspend en sessionThread.Resume, het updaten van de user sessie pauzeren.
Het probleem is nu, dat de thread zodra die timer start, zelf dood gaat. De timer thread loopt wel gewoon verder. Een thread timer heeft zelf echter geen suspend/resume. Suspenden/resumen gaat dan dus niet, want de thread is zelf al stopped.

Nu dacht ik, als ik die timer nou eens helemaal weg haal en het met Sleep doe:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
private void iUpdateSessionInterval = 1000;

private void Start()
{
                sessionThread = new Thread(new ThreadStart(UpdateSession));
                sessionThread.Start();
}

private void UpdateSession(Object data)
{
    Debug.WriteLine("update de user sessie");
    Thread.Sleep(iUpdateSessionInterval);
}


Maar wanneer ik het zo doe, wordt de thread afgeknalt zodra hij Sleep aanroept. Weet iemand misschien wat ik verkeerd doe en hoe ik het wel zou moeten aanpakken?

  • CodeIT
  • Registratie: Juni 2002
  • Laatst online: 21:22

CodeIT

Code IT

Even twee dingen die me opvallen. Een timer kan je "suspenden" mbv de enabled property.

In je laatste codevoorbeeld is het logisch dat je thread wordt "afgeknald". Na de sleep is er geen code meer. Als je je debug.Writeline en je sleep in een while loop zet, zal het goed moeten gaan met een thread suspend en resume.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Als je nu eens die Thread weghaalt, en alleen met die timer doet ?
Ik zie niet in waarom je hiervoor een Timer in een aparte Thread wilt starten ? Die Timer doet toch al alles wat je wil ?

https://fgheysels.github.io/


  • CodeIT
  • Registratie: Juni 2002
  • Laatst online: 21:22

CodeIT

Code IT

whoami schreef op woensdag 23 mei 2007 @ 14:29:
Als je nu eens die Thread weghaalt, en alleen met die timer doet ?
Ik zie niet in waarom je hiervoor een Timer in een aparte Thread wilt starten ? Die Timer doet toch al alles wat je wil ?
Een timer loopt niet in een aparte thread waardoor, als de functie die je in de timer aanroept aardig lang duurt, je GUI thread "hangt".

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Hoezo wordt de thread afgeknald?

waarom doe je het niet zo

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public void Start()
{
    if( timer == null )
          timer = new Timer( TimerExpired, null, interval, interval );
}

public void Stop()
{
    if( timer != null )
    {
         timer.Dispose();
         timer = null;
    }
} 

private void TimerExpired(object state)
{
       //Doe je ding
}

Dan kan je gewoon met Start en Stop werken.
edit: spuit 11
CodeIT schreef op woensdag 23 mei 2007 @ 14:32:
[...]

Een timer loopt niet in een aparte thread waardoor, als de functie die je in de timer aanroept aardig lang duurt, je GUI thread "hangt".
Dan moet je in je Timer Callback bijvoorbeeld gewoon een backgroundworker starten.

[ Voor 30% gewijzigd door Woy op 23-05-2007 14:35 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • TangLeFuzZ
  • Registratie: Juni 2001
  • Laatst online: 15-10 12:48
@CodeIT: aber natuhrlich. nogal dom :) Hij blijft nu wel goed lopen... zit alleen nog wel met 1 heel vreemd probleem:

Mijn if statement om de status van de thread te checken werkt niet. Zodra de thread is gestart en draait, is het mogelijk om z'n state op te vragen:

if (sessionThread.ThreadState == System.Threading.ThreadState.Running)
{
// doe iets
}

Als ik daar een breakpoint op zet, dan zie ik dat hij links echt op Running staat, maar om een of andere reden komt hij niet binnen het if statement?

Edit: sessionThread.Threadstate werkt om een of andere reden niet, maar Thread.CurrentThread.ThreadState wel. Ik vraag me alleen af of dit niet gevaarlijk is, want zo weet ik natuurlijk niet 100% zeker dat het wel die sessionThread is waar hij naar kijkt, of wel?


@rwb, ik zal zo eens naar jouw manier kijken...

[ Voor 19% gewijzigd door TangLeFuzZ op 23-05-2007 14:42 ]


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 21:34

mulder

ik spuug op het trottoir

Volgens ontbreekt de informatie of je met WinForms of ASP.Net werkt?

oogjes open, snaveltjes dicht


  • TangLeFuzZ
  • Registratie: Juni 2001
  • Laatst online: 15-10 12:48
Don Facundo schreef op woensdag 23 mei 2007 @ 14:49:
Volgens ontbreekt de informatie of je met WinForms of ASP.Net werkt?
ah excuses, WinForms :)

Heb het nu trouwens op de manier van rwb geimplementeerd, en dat werkt op zich perfect :)

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Als je Start en Stop van verschillende threads aanroept zul je nog wel wat moeten doen om het ThreadSafe te maken. Als je het echter alleen vanuit de interface thread aanroept is dat geen probleem

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 21:34

mulder

ik spuug op het trottoir

Offtopic hoor, maar dat vroeg ik omdat ik het idee had dat je met ASP.Net werkte omdat je tegen problemen aan leek te lopen die ik heb gehad met Threads in ASP.Net, niet dus ;)

oogjes open, snaveltjes dicht

Pagina: 1