Obsługa wyjątków - efekt "Brak odpowiedzi" programu, można tego efektu uniknąć ?

0

w C# jestem mocno zielony.

Mam program, który łączy się z maszyną ( krawędziarka).
Udało mi się dojść do tego momentu, że jak program traci połączenie z maszyną ( wyłączona, bądź zanik sieci), to się nie wyłącza, lecz Przywiesza ( Brak odpowiedzi ) i odwiesza gdy połączenie wraca ( obsługa wyjątków - ponowna próba połączenia z 10s Thread sleepem. ). Czy jest możliwość, aby program sie nie zawieszał, tylko pracował sobie w tle i miał brak efektu "Brak odpowiedzi" ? Program nie zawiera żadnych elementów do podejmowania działań - czysto statystyczny programik do przechwytywania sygnałów z maszyny, więc nic nie byłoby wykonywane w trakcie prób odnowienia połączenia. Istnieje taki sposób ?

Visual studio, a może : czy wystarczy odchaczyć wszystko w : Ustawienia wyjątków - przerwij w przypadku zgłoszenia ?

2

Łącz się z maszyną w osobnym wątku zamiast w wątku z UI. Wtedy nawet jak tam będziesz czekać na coś to UI będzie cały czas "dawał oznaki życia". Bo teraz jak robisz Thread.Sleep to całe okno blokujesz na 10sek i system myśli, że coś poszło nie tak.
A z drugiego wątku nadal możesz aktualizować kontrolki w oknie.

0

Ma to jakiś sens, dziękuję :-) musze zobaczyć jak się tworzy osobny wątek, bo na razie mam osobną metodę, a w c# jak mówilem, jestem zielonkawy :D ( w Javie bym zrobił osobną klasę do tego :) )

2

w Javie bym zrobił osobną klasę do tego :) )

W C# podobnie ;) Ale ogólnie to raczej googlaj pod hasłem Task, Taski są wygodniejsze w użyciu niż surowe wątki.

0

Czy Taski można w prosty sposób zakończyć, gdy wyłączy się okno główne ?
Mam z tym problem obecnie :D

2

Przekazujesz token i wywołujesz metode Cancel lub ustawiasz sobie czasowo, kiedy ma się zakończyć

  tokenSource.CancelAfter(TimeSpan.FromSeconds(3));

Przykład

        var tokenSource = new CancellationTokenSource();
            Task.Run(async () =>
              {
                  while (true)
                  {
                      await Task.Delay(100);
                      Console.WriteLine("task working");
                      if (tokenSource.IsCancellationRequested)
                      {
                          Console.WriteLine("task canceled");
                          break;
                      }
                  }
              }, tokenSource.Token);            
            Thread.Sleep(3000);
            tokenSource.Cancel();

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