Zakończenie wątków

0

Witam, mam problem z zakończeniem wątku.
Jest to aplikacja serwer która każdemu zalogowanemu klientowi tworzy nowy wątek:

 new Thread(new ThreadStart(new sesja(clientinf.login, klient, klienci).run)).Start();

Uruchamia metodę run z klasy sesja. Metoda ta w pętli while(true) odbiera dane od klienta. Teraz chcę zrobić zakańczanie połączenia, jeśli klient się rozłączy z serwerem, to pasuję zakończyć ten wątek który go obsługiwał. Klient przed zakończeniem wysyła do serwera komendę że kończy pracę, aby serwer zamknął połączenie tcp, i pousuwał go z różnych list etc, tam gdzie był potrzebny. Chcę jeszcze zrobić, żeby i zamknąć wątek tylko nie wiem jak to obsłużyć.

0

Nie możesz przypisywać wątku do jakiejś zmiennej i go później zamykać?

0

W przypadku, kiedy uruchamiałem jeden wątek, tak robiłem, tu mogę mieć uruchomionych ich kilkanaście i nie bardzo wiem jakby przypisywać ich do zmiennej...

0

Jeśli masz jeden wątek = jeden użytkownik, stwórz sobie lockowany słownik, gdzie kluczem będzie id wątku, a value np prosta klasa

public class ThreadUser
{
public Guid UserId;
public bool IsLogin;
}

i zamiast while(true)

używasz while(threadUsersDictionary[Thread.CurrentThread.Id].IsLogin)

0

Ok, a jak dodać/odczytac id wątku żeby dodać do słownika, i później jak zrobić, żeby usunąć/zamknąć właśnie ten dany wątek??

0

Klient przed zakończeniem wysyła do serwera komendę że kończy pracę, aby serwer zamknął połączenie tcp, i pousuwał go z różnych list etc, tam gdzie był potrzebny. Chcę jeszcze zrobić, żeby i zamknąć wątek tylko nie wiem jak to obsłużyć.

Jest na to parę sposobów, możesz zrobić m.in. tak

new Thread(new ThreadStart(new sesja(clientinf.login, klient, klienci).run)).Start();

w metodzie run

void Run()
{
threadUsersDictionary.Add(Thread.CurrentThread.Id, new ThreadUser(UserId, true));

while(threadUsersDictionary[Thread.CurrentThread.Id].IsLogin)
{
//odbierz dane
if(odebraneDane = koniecSesji)
{
//można wykonać break - przerywając pętle, bądź ustawić flagę
threadUsersDictionary[Thread.CurrentThread.Id].IsLogin = false;
}

//usuń ze słownika
threadUsersDictionary.RemoveAt(Thread.CurrentThread.Id);
}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1