DispatcherTimer Tick事件在WPF中的异常后停止

时间:2015-03-20 12:46:41

标签: c# wpf

我们使用DispatcherTimer在WPF应用程序中更新标签中的日期时间。

它的tick事件在异常后停止工作。

DispatcherTimer timer = new DispatcherTimer();            
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += new EventHandler(timer_Tick);
timer.Start();

我们添加了Dispactch未处理的异常以捕获所有未处理的异常。

this.Dispatcher.UnhandledException += new System.Windows.Threading.DispatcherUnhandledExceptionEventHandler(Dispatcher_UnhandledException);

DispatcherTimer tick事件的错误调用(默认值为零)。异常应用程序处理完对UnhandledException&然后停止调用DispatcherTimer tick事件。

void timer_Tick(object sender, EventArgs e)
        {
            ServerClock = ServerClock.AddSeconds(1);

            int a = 0;
            int i = 1 / a;

        }

什么阻止tick事件在另一个tick中运行?

1 个答案:

答案 0 :(得分:0)

  

什么阻止tick事件在另一个tick中运行?

未处理的异常。如注释中所述,如果从计时器tick处理程序抛出异常,则通过设计不会再次调用处理程序。 “解决方法”是避免首先抛出异常,或者如果根本不可能,则以优雅的方式处理异常。

如果您无法避免异常并且无法正常处理它(即以某种方式比仅添加try { } catch (Exception) { }更优雅和精确),那么您的代码将被破坏并需要修复。这是另一个问题。

请注意,Dispatcher.UnhandledException正是其名称所暗示的:它是在发生未处理的异常时引发的事件。

重要的是,为该事件订阅处理程序不会导致异常本身被处理。它仍然未处理。只是现在你有办法知道实际上存在未处理的异常。

由于订阅事件不会导致处理异常,因此在发生异常时也不会以任何方式更改计时器的行为。


最后,我会注意到至少还有两个其他的计时器类,以及.NET中至少有一个可以在WPF程序中使用的异步计时机制。即使您的处理程序抛出异常,也有可能(我没有检查并且不记得我的头脑中)其中一个或多个会继续引发tick事件。但是a)使用其中一种其他机制可能会以其他方式使代码复杂化,并且b)这样做不会以任何方式改变现在的情况,即你的代码根本不正确并且需要修复。