Kończenie wątku za pomocą zmiennej

0

Mam pewien problem z kończeniem aplikacji klienta. Może najpierw troszkę kodu:

private void Work()
        {
            ThreadStartCln(true);
            Cln = new TcpClient(host.Text, 8001);
            Cln.ReceiveTimeout = 5;
            byte[] buff = new byte[1024];
            while (work)
            {
                try
                {
                    string cmd = en.GetString(buff, 0, Cln.Client.Receive(buff));
                    ThreadAppendText(cmd);
                }
                catch (Exception)
                {

                }
            }
            Cln.Close();
            Cln = null;
            ThreadStartCln(false);
        } 

Jest to metoda nasłuchująca odpowiedzi serwera. Zgodnie z moim założeniem przy zmianie pola work na false w głównym wątku miało spowodować wyjście z pętli i zakończenie wątku. Wszystko to miało być kontrolowane przez zaznaczenie i odznaczenie checkboxa.

private void btnConnect_CheckedChanged(object sender, EventArgs e)
        {
            if (!Th.IsAlive)
            {
                work = true;
                Th.Start();
            }
            else
            {
                work = false;
                Th.Join();
            }
        }

Wątek ładnie się rozpoczyna i gdy działa, to po zmianie zaznaczenia wchodzi w blok else, jednak wygląda to tak jakby Work() nie widział, że work jest ustawione na false przez co wątek główny jest zablokowany bo ciągle czeka na zakończenie Th. Coś czuję, że mogłem jakiś oczywisty błąd popełnić. Z góry dziękuję za pomoc.

0

string cmd = en.GetString(buff, 0, Cln.Client.Receive(buff));
Zdaje mi się, że ciągle z klienta odbierasz dane, dlatego nie dochodzi do ponownego sprawdzenia warunku work.

Ewentualnie wywołanie Th.Join() następuje w momencie, gdy wykonywane są warunki (bo są w innym wątku)

            Cln.Close();
            Cln = null;
            ThreadStartCln(false);
0

Obawiam się, że nie w tym rzecz. Nawet po zakomentowaniu wczytywania zawartości bufora do stringa, efekt jest taki sam.

0

Problem rozwiązany na innym forum. ThreadStartCln() zmieniał kontrolki z wątku głównego a wątek główny był blokowany przez Join() i miałem sytuację wzajemnego blokowania.

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