繁体   English   中英

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

[英]DispatcherTimer Tick event stopped after exception in WPF

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

异常后,其滴答事件停止工作。

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滴答事件的错误调用(被零分隔)。 在异常应用程序处理了对UnhandledException的调用之后,然后停止了调用DispatcherTimer tick事件。

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

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

        }

什么是停止滴答声事件以在另一个滴答声中运行?

什么是停止滴答声事件以在另一个滴答声中运行?

未处理的异常。 如注释中所述,如果计时器滴答处理程序引发了异常,则根据设计,您的处理程序将不会再次被调用。 “解决方法”是避免首先抛出异常,或者,如果根本不可能,则以优雅的方式处理异常。

如果您无法避免异常并且不能优雅地处理它(即,以某种方式比仅添加try { } catch (Exception) { }更为优雅和精确),则您的代码已损坏,需要修复。 不过,这是另一个问题。

请注意, Dispatcher.UnhandledException正是其名称所隐含的含义:这是当发生未处理的异常时引发的事件。

重要的是,向该事件订阅处理程序不会导致异常本身得到处理。 它仍然没有处理 只是现在您有了一种方法来知道实际上存在未处理的异常。

由于订阅该事件不会导致异常被处理,因此在发生异常时,这样做也不会改变计时器的行为。


最后,我将指出,在WPF程序中可以使用至少两个其他计时器类,以及.NET中至少一个其他异步计时机制。 即使您的处理程序抛出异常,也有可能一个(或多个)(我没有检查,也没想起)会继续引发滴答事件。 但是a)使用其他机制之一可能会使您的代码复杂化,并且b)这样做不会改变这样一个事实,即您目前的代码从根本上来说是不正确的,需要修复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM