Toon posts:

[C#] Thread wil niet aborten???

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hmmz, ik heb een Thread gemaakt, en ik wil deze Thread natuurlijk op een gegeven moment weer laten stoppen. Daarvoor gebruik ik dus <thread>.Abort() voor. Volgens de documentatie wordt er dan een ThreadAbortException gegooid (:?). Deze Exception catch ik dus binnen m'n void voor die thread, maar hij komt nooit aan op het stukje catch code. Heel vaag. ffies wat code:

De code om de thread aan te maken.
code:
1
2
3
ServerThread = new Thread(new ThreadStart(StartServer));
ServerThread.Name = "Interlink XP Listening Thread";
ServerThread.Start();

De code om de thread te aborten.
code:
1
ServerThread.Abort();

De StartServer void:
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
private void StartServer() 
{
    try 
    {
        InterlinkXPServer = new TcpListener(ServerSettings.ServerPort);
        InterlinkXPServer.Start();
        while (true) 
        {
            TcpClient tempClient = InterlinkXPServer.AcceptTcpClient();
            int newid = Connections.Add(new Connection(tempClient, this));
            ((Connection)Connections[newid]).SendWelcome();
        }
    }
    catch (System.Threading.ThreadAbortException) 
    {
        InterlinkXPServer.Stop();
        foreach (Connection con in Connections) 
        {
            con.SendLine("421 Service is shutting down. Closing control connection.");
            Connections.Remove(con);
        }
        return;
    }
}

Als ik dus een breakpoint zet op het regeltje: InterlinkXPServer.Stop(); dan breakt ie dus nergens. Hoe kan dit?

  • stylee
  • Registratie: December 2000
  • Laatst online: 04-09-2021

stylee

blah zeg ik je

jmezach: De code om de thread te aborten.
code:
1
ServerThread.Abort();

Probeer eens
code:
1
2
ServerThread.Abort();
ServerThread.Join();

Verwijderd

Topicstarter
Dan blijft ie gewoon hangen.

Verwijderd

Topicstarter
Iemand nog een idee?

  • Remenic
  • Registratie: Juni 2001
  • Laatst online: 09-08 20:06
waar ergens roep je die Abort() aan dan?

Ik had zelf de fout gemaakt om Abort() aan te roepen in de deconstructor, zodat de thread wordt gestopt wanneer ik het programma afsluit. Echter, de deconstructor wordt pas aangeroepen zodra het programma inclusief alle threads gestops zijn...

Aangezien dit een standaard windows form was kon ik met het closing event de thread alsnog tot een eind brengen.

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 22:27
Misschien is het een idee om een boolean expressie te gebruiken in je while lus ipv true.
Dus dan krijg je zoiets:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
boolean keepRunning=true;

public void stop()
{
   keepRunning=false;
}

private void StartServer()
{
   while (keepRunning)
   {
    .....
   }
}

Dit is trouwens in java de eenvoudigste manier om een thread te laten stoppen. Heb zelf geen ervaring met C#, maar ik neem aan dat deze constructie gewoon moet werken.

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Ik doe in mijn c# prog dit:
code:
1
2
while(System.Threading.Thread.CurrentThread.ThreadState == ThreadState.Running && socket.Connected)
{...}

[edit]
hmm zie mij intellisense bezig zijn :P

Verwijderd

Topicstarter
Hmmz, 'k heb het al opgelost. De AcceptTcpClient functie wacht net zo lang totdat er iemand connect. Maar om die call te stoppen moet je dus <TcpListener>.Stop() aanroepen. Daarna wordt er een exception gegooid, en die kan je weer afvangen om de nodige zaken op te ruimen (connecties sluiten en zo). Het probleem is nu alleen weer dat m'n programma opeens 100% van de CPU gebruikt als hij voor de tweede keer bij de AcceptTcpClient regel komt.

Zie ook het volgende topic:

[topic=479065/1/25]
Pagina: 1