无限循环使TimeManager无效

时间:2013-02-05 19:37:44

标签: c# wpf exception-handling infinite-loop unhandled-exception

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

  

无限循环似乎是反复出现的   在布局/渲染过程中使TimeManager无效。

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

  

at System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object   resizedCompositionTarget)at   System.Windows.Media.MediaContext.RenderMessageHandler(对象   resizedCompositionTarget)at   System.Windows.Threading.ExceptionWrapper.InternalRealCall(代表   回调,对象args,Int32 numArgs)at   MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(对象   source,Delegate方法,Object args,Int32 numArgs,Delegate   catchHandler)

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

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

3 个答案:

答案 0 :(得分:4)

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

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

事实上有许多无限循环场景可能。 它们可能由CurrentStateInvalidated处理程序或已完成的处理程序或CurrentTimeInvalidated触发,我可能会忘记使用其他类型的触发器(鼠标,...)和/或之前提到的三种情况。可能代码太复杂了。

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

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

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

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

希望这有帮助。

编辑: 请听听我的建议:

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

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

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

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


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


可能发布一些xaml。


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

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

答案 1 :(得分:-1)

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

 catch(Exception ex)
{
..
}

    catch()
{
..
}

正如Peli的回复中提到的那样,还有其他一些难以捕捉的低级异常

答案 2 :(得分:-1)

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

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

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