【问题标题】:Infinite loop invalidating the TimeManager无限循环使 TimeManager 无效
【发布时间】:2013-01-20 20:24:38
【问题描述】:

我在我的 WPF 应用程序中遇到了一个非常棘手的缺陷,无法追踪。错误信息是:

一个无限循环似乎是由反复造成的 在布局/渲染过程中使 TimeManager 失效。

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

在 System.Windows.Media.MediaContext.RenderMessageHandlerCore(对象 resizedCompositionTarget) 在 System.Windows.Media.MediaContext.RenderMessageHandler(对象 resizedCompositionTarget) 在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(委托 回调,对象参数,Int32 numArgs)在 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(对象 源,委托方法,对象参数,Int32 numArgs,委托 catchHandler)

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

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

【问题讨论】:

  • 它在所有机器上(在所有环境中)都失败了吗?您是否拥有包含所有热修复程序的最新版本的 WPF?
  • 在所有环境中的所有机器上都失败了,是的,我们在所有服务包上都是最新的。但是,我们使用的是 .NET 4.0 版本而不是 4.5,因此我们没有最新版本的 WPF。我们不太可能很快升级到 4.5。

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


【解决方案1】:

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

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

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

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

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

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

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

希望这会有所帮助。

编辑: 请听我的建议:

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

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

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

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


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


也许发布一些 xaml。


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

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

【讨论】:

  • 文森特,感谢您抽出宝贵时间回答我的问题。你以前经历过异常吗?我的情况是,我正在与一位知道如何在 xaml 中编写代码的图形设计师合作,但在技术上并不倾向于。
  • 感谢文森特为您提供额外的 cmets。你以前有没有遇到过这种异常?
  • 我刚刚又遇到了这个异常,并且没有涉及动画。我正在关闭一个包含 Infragistics 网格、一个文本框和四个按钮的对话框。当我关闭对话框时抛出异常。
  • 好吧,如果我误导了,我很抱歉。但是,无论如何(并且可能会寻求另一个方向):您提到的网格是否涉及动画或网格的关闭涉及父窗口中的动画?
  • Vincent,我不希望我关于您是否曾直接遇到过此问题的问题表明您在误导我。一点也不,我欢迎你愿意加入并提供帮助。我只是想知道这是否曾经发生在你身上。当我的平面设计师从假期回来时,我会让她从动画的角度来研究这个。网格不直接使用动画,但这并不意味着设计者没有在xaml代码的深处使用它。
【解决方案2】:

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

 catch(Exception ex)
{
..
}

    catch()
{
..
}

还有其他难以捕捉的低级异常,在Peli的回复中提到

【讨论】:

  • Avani,感谢您抽出宝贵时间回答我的问题。我对您对使用空捕获将如何帮助我追踪问题的想法感兴趣?
  • 嗨 MikeMalter,很抱歉回复晚了。空捕获可能会帮助您缩小代码中引发异常的区域。
  • 一个空的catch是怎么做到的?谢谢。
  • 我明白你的意思,catch(Exception) 仅捕获 System.Exception 类型的异常,因为我将所有内容都包含在 try/catch(Exception) 块中,并且 TimeManager 异常永远不会得到汇总为 System.Exception,如果我在没有参数的情况下捕获异常,我可能会捕获 TimeManager 异常。问题是异常是间歇性的,并且在随机条件下发生在随机位置,并且重新编码我的应用程序以捕获它在这一点上不是一个选项。但是,你的答案是迄今为止最好的,所以你得到了赏金。
  • 在 .NET 领域中没有不继承自 System.Excetpion 的异常。这个答案全错了。 referencesource.microsoft.com/#PresentationCore/Core/CSharp/…
【解决方案3】:

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

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

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

【讨论】:

  • Rodrigo,您的链接适用于 WinForms,我的问题与 WPF 有关。我查看了您发布的链接,它不相关。
  • 我明白这一点,这就是为什么我认为你应该看看。 WPF 中没有对 TimerManager 类的任何引用。您是否有可能使用了错误的引用或使用 WinForms 类可能会导致 WPF 崩溃的东西?
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 2013-09-05
相关资源
最近更新 更多