C# 无限循环使时间管理器无效

C# 无限循环使时间管理器无效,c#,wpf,exception-handling,infinite-loop,unhandled-exception,C#,Wpf,Exception Handling,Infinite Loop,Unhandled Exception,我在我的WPF应用程序中遇到了一个非常棘手的缺陷。错误消息是: 一个无限循环似乎是由多次重复引起的 在布局/渲染过程中使TimeManager无效 堆栈跟踪(就其价值而言)是: 位于System.Windows.Media.MediaContext.RenderMessageHandlerCore(对象 调整大小的组件目标)位于 System.Windows.Media.MediaContext.RenderMessageHandler(对象 调整大小的组件目标)位于 System.Window

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

一个无限循环似乎是由多次重复引起的 在布局/渲染过程中使TimeManager无效

堆栈跟踪(就其价值而言)是:

位于System.Windows.Media.MediaContext.RenderMessageHandlerCore(对象 调整大小的组件目标)位于 System.Windows.Media.MediaContext.RenderMessageHandler(对象 调整大小的组件目标)位于 System.Windows.Threading.ExceptionWrapper.InternalRealCall(委托 回调,对象args,Int32 numArgs)位于 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(对象 源,委托方法,对象参数,Int32 numArgs,委托 捕手)

这是一个间歇性缺陷,我唯一能捕捉到它的地方是在app config文件中,在那里我捕获了Application\u dispatchernhandledexception消息。我的应用程序中的所有内容都被包装在try-catch块中,但这最终会捕获未处理的异常


有人对此有什么见解吗?我在互联网上搜索了一些东西,但什么也没找到,我想这里的某个人可能有一些见解或想法,如何找到这个。目前,我正在接受这个异常,并让应用程序继续运行,因为它似乎对它没有任何影响(除了崩溃它)。

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

因此,无论您是在Xaml中创建动画还是使用代码创建动画,例如,都会在动画B停止时触发动画A开始,在动画A开始时触发动画B停止。 所以你有一个无休止的循环:A开始->B停止->A开始->B停止->

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

删除所有动画以测试此场景

试着有一个清晰的方法来重现这个bug,并检查哪些处理程序可能参与这样一个循环,并不断地相互调用

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

。。。或者只是一次代码检查可能会向您显示可能的循环

希望这有帮助

编辑: 请听我的建议:

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

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

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

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


第二:它可能是一个属性/数据触发器,某些数据经常更改


可能会发布一些xaml


我有一个想法:尝试在应用程序中设置断点\u DispatcherUnandledException。然后观察内部异常的内部异常的。。。直到到达MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen。例外,那么你就可以知道来源了。我不会感到惊讶,这是基础设施网格造成的问题。我曾经测试过Telerik的控制,在解决了一些可怕的问题后,我回到了我自己定制的经典网格:节省了金钱和时间。我很快就看到了这个网格:它们就像你的转换器的问题一样或者自定义样式的问题。 -->如果可能,尝试使用标准数据网格。
-->如果没有bug,我们就找到了根本原因:尝试一个“裸”的基础设施网格,然后测试,然后添加样式,然后测试。我不确定您是否可以在没有转换器的情况下进行测试。但始终可以让视图模型公开“已转换”属性


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

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

 catch(Exception ex)
{
..
}


还有其他低级别异常很难捕获,如

的回复中所述,您是否已经解决了问题? 我做了一点研究,听起来你在使用基础设施的第三方控件,对吗


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

文森特,谢谢你抽出时间回答我的问题。您以前是否经历过异常?我的情况是,我正在与一位图形设计师合作,他知道如何使用xaml进行编码,但在技术上并不倾向于这样做。谢谢Vincent的补充意见。你以前有没有经历过这个异常?我只是再次遇到这个异常,没有涉及动画。我正在关闭一个对话框,它有一个基础设施网格、一个文本框和四个按钮。异常是在我关闭对话框时引发的。好的,如果我有误导性,我很抱歉。但是,不管怎样(也许在寻找另一个方向之后):你提到的网格是包含动画还是t
    catch()
{
..
}