[C#] Kończenie pętli w wątku za pomocą zmiennej


(Musialowski Tomasz) #1

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.


(Tomek Matz) #2

Spróbuj zakomentować linijki

ThreadAppendText(cmd);

ThreadStartCln(false);

i zobacz, czy kod zadziała.

Wydaje mi się, że ma tu miejsce następująca sytuacja ... Najpierw blokujesz wątek podstawowy dopóki wątek dodatkowy nie zakończy swojej pracy, a potem w tym wątku dodatkowym próbujesz wykonać jakąś operację na dopiero co zablokowanym wątku podstawowym. Nie wywołujesz tam przypadkiem jakiegoś Invoke albo coś?


(Musialowski Tomasz) #3

Tak, chodziło o metodę ThreadStartCln(). Invoke ustawia odpowiednie parametry kontrolki. Nie ma jednak sensu robić tego z wątku Th skoro i tak wywoływane jest to przez zdarzenie. Pojawił się teraz problem wznawiania wątku, ale problem z tematu rozwiązany więc dziękuję ślicznie :slight_smile: