繁体   English   中英

无限循环使TimeManager无效

[英]Infinite loop invalidating the TimeManager

我在WPF应用程序中遇到一个非常棘手的缺陷以进行跟踪。 错误消息是:

在布局/渲染过程中反复使TimeManager无效似乎导致了无限循环。

堆栈跟踪(价值)为:

在MS的System.Windows.Media.MediaContext.RenderMessageHandler(Object resizedCompositionTarget)在System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget)在MS。 .Internal.Threading.ExceptionFilterHelper.TryCatchWhen(对象源,委托方法,对象args,Int32 numArgs,委托catchHandler)

这是一个间歇性缺陷,我唯一能捕捉到的地方是我捕获Application_DispatcherUnhandledException消息的应用程序配置文件中。 我在应用程序中拥有的所有内容都包裹在try catch块中,但这在捕获未处理异常的地方就出现了。

有人对此有见识吗? 我在互联网上搜索了什么东西,却一无所获,以为这里的某人可能有一些见解或想法,可以找到答案。 目前,我正在吞下此异常,并让该应用继续运行,因为它似乎对它没有任何影响(除了崩溃)。

可以预料,您将无法在代码中捕获异常:您的错误来自应用程序的Xaml部分,很可能来自动画。

因此,无论您是在Xaml中创建动画还是使用代码创建动画,例如,当动画B停止时触发动画A开始,而动画A开始时触发动画B停止。 因此,您将陷入无尽的循环:A开始-> B停止-> A开始-> B停止-> ...

实际上,有很多无限循环的情况。 它们可能是由CurrentStateInvalidated处理程序或Completed处理程序或CurrentTimeInvalidated触发的,我可能会忘记使用其他类型的触发器(鼠标,...)和/或前面提到的三种触发器的某些情况。 代码可能太复杂。

删除所有动画以测试这种情况。

尝试有一种清晰的方法来重现该错误,并检查在这种循环中可能涉及到哪些处理程序,并不断地互相调用。

...您还可以在处理程序中使用一个计数器,例如,有一个复选框警告您已达到给定(大量)的调用次数。 此复选框还将提供处理程序的名称。 单击确定几次以检查循环“成员”。
您可以在发行版本中保留类似的代码,并仅写入一次日志文件,达到该数字后,处理程序将始终在执行任何操作之前返回。 比崩溃更好。

...或者只是代码审查可能会向您显示可能的循环。

希望这可以帮助。

编辑:请听我的建议:

A)删除所有动画,测试应用程序,然后看看会发生什么。 B)如果看不到其他错误:这就是原因。

C)然后,在动画中,尝试删除最“危险”的触发器,即事件触发器。 您可以使用来将XAML放入注释中,因此只需在动画之后复制经过触发器即可。

D)再次测试:如果没有更多的错误,这是一个事件触发器E)复查所有事件触发器,并注意一个如上所述的循环。

如果在D)中您仍然看到错误,请在C)与其他触发器(属性触发器/数据触发器)重复


第二点:可能是属性/数据触发器,其中某些数据经常更改...


张贴一些XAML。


我有个主意:尝试在您的Application_DispatcherUnhandledException中设置一个断点。 然后观察内部异常的内部异常的...,直到到达MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen。 例外,那么您可以知道来源。 我不奇怪这是Infragistics网格引起的问题。 我曾经测试过Telerik的控件,在解决了几个可怕的问题之后,我回到了自己定制的经典网格上:节省了金钱和时间。 我很快就注意到了这个网格:它们就像您的转换器自定义样式的问题一样。 ->尽可能尝试使用标准的DataGrid。
->如果没有错误,我们有根本原因:尝试一个“裸露的”基础设施网格,然后进行测试,然后添加样式,然后进行测试。 我不确定您是否可以在没有转换器的情况下进行测试。 仍然总是有可能让视图模型公开'converted'属性...

再次:在您的帖子中,引用一些xaml,描述失败的情况。

有时,异常非常棘手。 建议之一是有一个没有异常对象的catch块。 因此,您可以从以下位置更新捕获块:

 catch(Exception ex)
{
..
}

    catch()
{
..
}

Peli的回复中所述,还有其他一些难以捕获的低级别异常

您已经解决了问题吗? 我进行了一些研究,听起来您正在使用Infragistics的第三方控件,对吗?

http://help.infragistics.com/doc/WinForms/2014.2/CLR4.0/?page=Infragistics4.Win.UltraWinStatusBar.v14.2~Infragistics.Win.UltraWinStatusBar.TimerManager.html

他们能够在这个问题上为您提供帮助吗?

暂无
暂无

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

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