【问题标题】:System.ExecutionEngineException PropertyChangedSystem.ExecutionEngineException PropertyChanged
【发布时间】:2011-01-02 16:13:59
【问题描述】:

如果有人可以为此提供一些帮助,我将非常感激!

我们正在使用:Silverlight 3 / MVVM / Blacklight DragDock Control / ComponentOne Silverlight Controls

我有一个严重依赖 MVVM 模式的 Silverlight 应用程序。直到最近,该应用程序似乎一直运行良好。我已经开始注意到半随机(半随机 = 在足够长的时间 ~2 - 5 分钟内)我可以重现来自引发的 PropertyChanged 事件的 System.ExecutionEngineException。为其引发通知的属性名称并不总是相同的属性名称(属性更改事件的触发发生在基础 ViewModel 类中)。

代码基本上是这样的:

if (PropertyChanged != null) Application.Current.RootVisual.Dispatcher.BeginInvoke( () => PropertyChanged(this, new PropertyChangedEventArgs(propertyName)));

该代码适用于应用程序中的所有其他内容。基本上所有引发属性更改事件的事情都会经历这个。我不确定为什么这会突然失败。请给我一些想法。

我一直在研究windbg,试图了解正在发生的事情,但仍然很少。我很乐意提供转储或任何其他可能有用的信息。显然,这个特定错误给出的信息非常少......

提前谢谢你,大卫·贾斯蒂斯

【问题讨论】:

  • 谢谢大家的回答。我认为我们将搜索范围缩小到第三方树控件中的问题,该问题基于在对基础集合进行排序后跟踪树中所选项目的问题而引发内部异常。错误的美妙之处在于它以两种不同的方式表现出来。一个,它在所选择的项目未更改时爆炸属性已更改,但更改了另一个树的另一个子,然后解雇了可观察的集合已更改的事件。第二个是更改所选项目时的索引超出范围异常。

标签: silverlight silverlight-3.0 mvvm


【解决方案1】:

这个例外是非常奇特的。如果有人被抛出,则游戏结束,CLR 继续 0。没有托管代码可以捕获该异常。

当我遇到它时,这是驱动程序写入缓冲区的结果,该缓冲区未正确编组,因此未固定,并且 CLR 在驱动程序写入缓冲区时移动了缓冲区。它不会立即崩溃,但通常发生在鼠标滑过窗体的菜单栏之后(这可能导致创建和销毁许多小对象,然后导致 CLR 运行 GC 并压缩托管堆)。尽管我的一个工作线程正在与驱动程序通信,但引发异常的是主线程,这让事情变得更加混乱。

确保正确编组。如果在非托管代码中来回传递任何内容,请确保使用 GCHandle 固定对象。

【讨论】:

    【解决方案2】:

    您可能会问自己一个问题:这个 ExecutionEngineException 是否仅在 IE 中发生,例如,不在 FireFox 中发生?

    我知道 Silverlight 应该是独立于浏览器的,但我已经遇到了类似的已知 Silverlight 问题,它仅在 IE 中随机发生。

    您收到 ExecutionEngineException 的事实表明 SL 运行时由于某种原因崩溃了。

    【讨论】:

    • 感谢您的想法。我只在 Firefox 中测试,我真的考虑过在 ie b/c 中测试它,我假设运行时独立性。不幸的是,我没有看到任何变化。在几个 UI 交互周期之后,我仍然看到运行时崩溃。我觉得我应该寻找可能的内存泄漏,或者仍然列出 VM 更改的 UI 控件。我一直在观察内存,它似乎正在清理自己,因为视图会在它们脱离上下文时自行移除。
    猜你喜欢
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 2021-09-04
    • 2012-12-28
    • 2021-09-30
    • 1970-01-01
    相关资源
    最近更新 更多