Zwalnianie pętli while

0

Witam,

Mam taki problem chciałby zwolnić wykonywanie pętli while a oto dlaczego, poniżej kod

 
            TcpClient klient1;
            Stream strumien1;
            int attempts = 0;

            while(true)
            {

                    try
                    {
                        klient1 = new TcpClient(adresIPS, 3301);
                        // Get the NetworkStream object
                        strumien1 = klient1.GetStream();
                        byte[] tabWej = new byte[1024];
                        while (klient1.Connected)
                        {
                           int ile = strumien1.Read(tabWej, 0, tabWej.Length);
                           String lanc1 = Encoding.ASCII.GetString(tabWej);
                           lanc1 = lanc1.Remove(ile, lanc1.Length - ile);
                           CzytajStrumien(lanc1);
                        }
                        klient1.Close();
                        break;
                    }
                    catch (SocketException)
                    {
                        Console.Clear();
                        Console.WriteLine("Próba poloczenia - {0}", attempts + 1);
                        //Console.ReadLine();
                
                    }
                    catch (IOException)
                    {
                        Console.WriteLine("Zerwano połączenie pliki utracone");
                        attempts = 0;
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                    }
                attempts++;
              
          }

Jak widać tworzę połączenie z serwerem, i teraz gdy wyłączę serwer podczas trwania połączenia ładnie while przechodzi do catch (SocketException) i wypisuje Próby połączenie 1,2,3 itd., jednak gdy dojdzie do zerwania połączenia internetowego -> Próby połączenia - przyspieszają niesamowicie i w przeciągu sekundy ma 1000 prób i za chwilę aplikacja się wykłada bo zapewne przekracza wartość int. Czy idzie to jakoś spowolnić, a może robię coś źle.

Z góry dziękuje za podpowiedź.

0

No po coś masz chyba tę zmienną attempts, wykorzystaj ją.

0

Wywołuj całą metodę/pętlę na oddzielnym wątku i go zatrzymuj.

Chyba możesz coś zrobić Asynchronicznie z tą klasą - ta informacja nie jest sprawdzona.

0

"Gubisz" zasoby - każda obiekt klasy implementującej interfejs IDisposable powinien mieć wywołaną metodą Dispose(). Najlepiej osiągniesz to tworząc takie obiekty wewnątrz klauzuli using.
Jeśli chcesz zwolnić, to uśpij na chwilę wątek (Thread.Sleep()).

0

mozesz tez zamiast petli uzyc jednej z klas typu Timer

0

Do catch dodaj Thread.Sleep(1000) - ponawiaj próbę co 1sek.
Dodaj za blok finally, a w nim klinet1.Dispose()

0

Ja z przyczyn ideologicznych jestem zagorzałym przeciwnikiem korzystania w c# z Thread, a juz w ogóle z Thread.Sleep i polecam zapoznanie sie z klasą Task :)

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