Ik probeer op dit moment om een programma te schrijven dat berichten ontvangt, daarvoor gebruik ik heel simpel sockets in C#, ik gebruik hier een appart thread voor zodat alles lekker asynchroon kan. Ik heb er expliciet niet voor gekozen om de async functies te gebruiken maar gewoon een while(true) loopje in dus een appart thread, dit om het allemaal zo simpel mogelijk te houden.
De code hieronder is zo als jullie zien vrij basic.
Het probleem zit hem erin dat ik dit thread niet kan stoppen. Als ik via een andere class Stop() aanroep gaat dat vrolijk goed zonder foutmeldingen, maar toch blijft het process lopen, zelfs als ik Application.Exit() aanroep. Dit is erg vervelend omdat je als je het programma dan opnieuw start je een error krijgt mbt al gebinde porten. (Ook is het gewoon zonde natuurlijk).
Nu vraag ik me af hoe ik er voor kan zorgen dat het thread echt stopt. Op dit moment stopt het pas nadat er nog 1 keer een socket geaccept wordt. Het is dan ook de listener.AcceptSocket() die het thread zelfs in zoverre blocked dat hij niet geabort wordt, wat vreemd is want de Stop methode wordt door een ander thread aangeroepen (het main thread), dat na het aanroepen van Stop() ook gewoon vrolijk verder gaat.
Ik heb gelezen over manual reset events en flags in de while loop, maar dat lost zover ik het snap dit probleem absoluut niet op. Zelf een bericht naar jezelf sturen zou het oplossen maar dat is natuurlijk ook foei lelijk.
Wie o wie heeft hier een schone oplossing voor.
De code hieronder is zo als jullie zien vrij basic.
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
| public class Server { private Thread thread; public void Start() { thread = new Thread(new ThreadStart(ServerLoop)); thread.Start(); } private void ServerLoop() { TcpListener listener = new TcpListener(1555); listener.Start(100); while (true) { Socket client = listener.AcceptSocket(); //boosdoener //doe spul } } public void Stop() { thread.Abort(); } } |
Het probleem zit hem erin dat ik dit thread niet kan stoppen. Als ik via een andere class Stop() aanroep gaat dat vrolijk goed zonder foutmeldingen, maar toch blijft het process lopen, zelfs als ik Application.Exit() aanroep. Dit is erg vervelend omdat je als je het programma dan opnieuw start je een error krijgt mbt al gebinde porten. (Ook is het gewoon zonde natuurlijk).
Nu vraag ik me af hoe ik er voor kan zorgen dat het thread echt stopt. Op dit moment stopt het pas nadat er nog 1 keer een socket geaccept wordt. Het is dan ook de listener.AcceptSocket() die het thread zelfs in zoverre blocked dat hij niet geabort wordt, wat vreemd is want de Stop methode wordt door een ander thread aangeroepen (het main thread), dat na het aanroepen van Stop() ook gewoon vrolijk verder gaat.
Ik heb gelezen over manual reset events en flags in de while loop, maar dat lost zover ik het snap dit probleem absoluut niet op. Zelf een bericht naar jezelf sturen zou het oplossen maar dat is natuurlijk ook foei lelijk.
Wie o wie heeft hier een schone oplossing voor.