Multithreading(Thread stoppen)

flyandshot

Grünschnabel
Hallo Community

ich bin zur Zeit an einem kleinen Chat dran.(VB.net) Auf dem Chat läuft Client und Server jeweils in einem eigenen Thread. Funktioniert alles auch gut und schön, nur wenn man das Programm nun schließt bleibt der Server Thread immer noch offen. Ich weiß das das daran liegt dass das Socket immer noch auf Nachrichten warten. Gibt es eine Frage den Thread zu beenden? Denn mit thread.Abort geht es auch nicht. Ich hab das was der ServerThread ausführen soll in einem Sub in einem Modul geschrieben. Lässt sich dieses irgendwie beenden?

Für Antworten schonmal im Vorraus dankeschön

m.f.G.: flyandshot
 
Hallo flyandshot,

Prinzipiell sollte Thread.Abort schon funktionieren. Andere Möglichkeit ist, den Thread einfach über ein Flag zu steuern, hier mal ein kleines Beispiel:

Code:
public class Test
{
private bool threadRunning = true;

public void Worker()
{
  while(threadRunning)
  {
     // do something
  }
}

public Test()
{
   Thread t = new Thread(new ThreadStart(this.Worker));
   t.Start();
}

public void Stop()
{
   threadRunning = false;
}
}

Du musst dann natürlich bei Beendigung des Programms irgendwie die Test.Stop()-Methode aufrufen.

Gruß
Flo
 
danke flo ich habs mit nem Flag versucht...
doch funktioniert hats leider nicht...
ich weiß nicht ob das am server Socket liegt... weil das auf anfragen wartet... vlt kann man das listen ja von außerhalb unterbrechen... ich hab das bisher ein bisschen unschön gelöst, indem ich an das wartende socket eine nachrichtschick... durch die nachricht wird dem socket dann gesagt exit sub... wobei das ja nicht wirklich schön ist


m.f.G.: flyandshot
 
ich weiß nicht ob das am server Socket liegt... weil das auf anfragen wartet... vlt kann man das listen ja von außerhalb unterbrechen
Du solltest am Programmende einfach den Server-Socket schließen (Close-Methode). Dann wird eine Exception geworfen und du kommst aus der Blockierung heraus.

Gruß
MCoder
 
hab ich im Finally also:
Code:
Try
 'Server in Listen Mode versetzen
            server1.Listen(1)

           
            'Clientanfrage aktzeptieren
            clientSocket = server1.Accept()

'Daten empfangen
            countbytes = clientSocket.Receive(bytes)
            message = Encoding.Unicode.GetString(bytes, 0, countbytes)

Catch e as exeption
           Msgbox(e.ToString)
             
Finally:

            clientSocket.Shutdown(SocketShutdown.Both)
            clientSocket.Close()

        End Try

nur das problem wird sein das es halt auf eine anfrage erst einmal wartet.
ich hab vor sowas wie n messenger zubauen...
nach der anmeldung soll den wird den anderen leuten die eigenen daten zugeschickt...
und um die zu empfangen läuft halt ein server der auf eingehende nachrichten wartet.

m.f.G.: flyandshot
 
In deinem Code schließt du nur den Client-Socket. Du must auch den Server-Socket schließen: server1.Close()

Gruß
MCoder
 
Zurück