无限循环使TimeManager无效

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

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

堆栈跟踪(它的价值)是:

在MS的System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback,Object args,Int32 numArgs)的System.Windows.Media.MediaContext.RenderMessageHandler(Object resizedCompositionTarget)中的System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget)处.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source,Delegate方法,Object args,Int32 numArgs,Delegate catchHandler)

这是一个间歇性的缺陷,我唯一可以捕获它的地方是在app配置文件中,我正在捕获Application_DispatcherUnhandledException消息。 我在我的应用程序中拥有的所有内容都包含在try catch块中,但是这些内容会在捕获未处理的exception的地方结束。

有没有人对此有任何见解? 我在互联网上搜索了一些东西并且没有发现任何东西,并且想到这里可能有人可能有一些见解或想法如何追踪这一点。 目前,我正在吞下这个exception并让应用程序继续运行,因为它似乎对它没有任何影响(除了崩溃)。

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

因此,您可以在Xaml中创建动画或使用代码,例如,您可以在动画B停止时触发动画A,在动画A开始时动画B停止。 所以你有一个无限循环:一个开始 – > B停止 – >一个开始 – > B停止 – > …

实际上有许多无限循环场景可能。 它们可能由CurrentStateInvalidated处理程序或Completed处理程序或CurrentTimeInvalidated触发,我可能会忘记使用其他类型的触发器(鼠标,…)和/或前面提到的三个触发器的一些场景。 可能代码太复杂了。

删除所有动画以测试此方案。

尝试有一个明确的方法来重现错误并检查哪些处理程序可能涉及这样的循环并无休止地互相称呼自己。

…你也可以在处理程序中使用一个计数器,例如,一个checkBox警告你已经达到了给定(大)的调用次数。 这个checkBox也会给出处理程序的名称。 单击确定几次以检查循环’成员’。
您可以在发布版本中保留类似的代码并写入一个日志文件,只有一次,当达到该数量时,处理程序将始终返回,然后再执行任何操作。 比崩溃更好。

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

希望这可以帮助。

编辑:请听听我的建议:

A)删除所有动画,测试应用程序,看看会发生什么。 B)如果你没有看到更多错误:这就是原因。

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

D)再次测试:如果你没有看到更多错误,这是一个事件触发器E)检查所有事件触发器并观察如上所述的循环。

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


其次:它可能是一个属性/数据触发器,其中一些数据经常变化……


也许发布一些xaml。


我有一个想法:尝试在Application_DispatcherUnhandledException中设置断点。 然后观察内部exception的内部exception……直到你到达MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen。 例外,那么你可以知道来源。 我不会感到惊讶的是Infragistics网格导致了这个问题。 我曾经测试过Telerik的控制权,在遇到一些可怕的问题之后,我回到了我自己定制的经典网格上:省钱和省时。 我很快就看到了这个网格:它们就像你的转换器或使用此网格的自定义样式一样 。 – >尽可能尝试使用标准DataGrid。
– >如果没有错误,我们有根本原因:尝试’裸’Infragistic网格,然后测试,然后添加样式,然后测试。 我不确定你可以测试没有转换器。 仍然可以让视图模型公开’转换’属性…

再次:在你的post中,引用你的一些xaml,描述失败案例。

有时exception非常棘手。 其中一个建议是使用没有exception对象的catch块。 所以你可以从以下位置更新你的catch块:

catch(Exception ex) { .. } 

  catch() { .. } 

正如Peli的回复中所提到的,还有其他一些难以捕捉的低级exception

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

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

他们能在这个问题上帮助你吗?