Exception w metodzie od Threading.Timer wyłącza program.

Exception w metodzie od Threading.Timer wyłącza program.
JB
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 57
0

Dlaczego gdy wykonamy poniższy kod, debuger zamiast się zatrzymać w miejscu exceptiona, zwyczajnie zamyka aplikację, nic nie mówiąc? Podobnie się dzieje gdy zbuilduje aplikację i uruchomię normalnie, nie w trybie debug. Wyskakuje takie okno i zonk:
user image

Kopiuj
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Timer t = new Timer(Test, null, 1, 1); // System.Threading.Timer
        }

        private void Test(object o)
        {
            throw new Exception();
        }

Jak mogę sobie z tym poradzić? W mojej aplikacji koniecznie chcę użyć czegoś w stylu timera, tak aby wykonywało kod co jakiś czas.

  • Rejestracja: dni
  • Ostatnio: dni
0

Timer tworzy nowy wątek. Wszystkie wyjątki w nowym wątku muszą być w nim obsłużone, jeśli tego nie zrobisz otrzymasz pokazany komunikat.

JB
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 57
0

Gdyby tak było, to ten kod spowodowałby taki sam rezultat, a tak nie jest. Problemem nie jest sam wątek, bo ten kod normalnie zatrzyma debugera:

Kopiuj
        
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Thread th = new Thread(Test);
            th.Start();
        }

        private void Test()
        {
            throw new Exception();
        }

Co jest takiego nadzwyczajnego w Timerze, że jest taki zonk? Jak to naprawić?

karoL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 24
Azarien
  • Rejestracja: dni
  • Ostatnio: dni
1

user image

karoL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 24
0

Myślę ze to powinno ci pomóc dla przykładu co 5 sekund jest wyświetlana godzina w TextBlock

Kopiuj
private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            Timer t = new Timer(5000);
            t.Elapsed += t_Elapsed;
            t.Enabled = true;

        }

        void t_Elapsed(object sender, ElapsedEventArgs e)
        {
            Dispatcher.Invoke(() => { time.Text = DateTime.Now.ToLongTimeString(); });
        } 

albo wyświetla czas ostatniego wystąpienia

Kopiuj
 e.SignalTime.ToString(); 

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.