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

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

        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.

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.

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:

        
        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ć?

1

user image

0

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

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

 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.