我是WPF引擎中一个bug的发现者吗?

我是WPF引擎中一个bug的发现者吗?,wpf,Wpf,我们有一个使用/CLR编译的MFC 8应用程序,其中包含大量的Windows窗体UserControls,其中再次包含使用ElementHost的WPF用户控件。由于我们软件的体系结构,我们不能直接使用HwndHost。我们在这里观察到一种非常奇怪的行为,我们无法理解: 当应用程序启动期间CPU负载非常高,并且存在大量活动的ElementHost实例时,整个属性引擎将完全停止工作。例如,通常工作正常的动画现在不会更新绑定属性的值,它们只是在启动后保持在某个随机值。当我设置一个没有绑定到任何东西的

我们有一个使用/CLR编译的MFC 8应用程序,其中包含大量的Windows窗体UserControls,其中再次包含使用ElementHost的WPF用户控件。由于我们软件的体系结构,我们不能直接使用HwndHost。我们在这里观察到一种非常奇怪的行为,我们无法理解:

当应用程序启动期间CPU负载非常高,并且存在大量活动的ElementHost实例时,整个属性引擎将完全停止工作。例如,通常工作正常的动画现在不会更新绑定属性的值,它们只是在启动后保持在某个随机值。当我设置一个没有绑定到任何东西的属性时,该值被正确地存储在dependency属性中(调用getter返回新值),但是可视化表示从来没有反映出这一点。我将背景设置为红色,但背景颜色不变

我们在很多运行WindowsXPSP2的不同机器上测试了这一点,它是非常可复制的

有趣的是,事实上有一种情况,绑定属性实际上从动画中拾取了一个新值,并且视觉效果根据属性值进行更新。当我调整ElementHost的大小或隐藏并重新显示父本机控件时。一旦我这样做,绑定到动画的属性将拾取一个新值,并且视觉效果将基于新属性值重新渲染(但仅此一次),如果我想看到另一个更新,我必须调整ElementHost的大小


你对这里可能发生的事情有什么解释吗?或者我如何处理这个问题来找出答案?我能做些什么来调试这个?有没有一种方法可以让我获得更多关于WPF实际做什么或WPF可能在哪里崩溃的信息?在我看来,这似乎是WPF本身的一个缺陷,因为它只发生在启动时CPU负载较高的情况下。

我没有与这些技术一起做任何工作,所以我不能真正谈论这一点。然而,在我看来,代码中似乎发生了某种死锁,它阻止了对redraw()的调用(或其等价物)。调整窗口的大小将强制重新绘制,但当您更改某些内容时,通知窗口重新绘制的正常机制可能会被阻止

您的代码中是否可能存在竞争条件?在负载较轻的系统上,事情可能以正确的顺序发生,但在负载较重的系统上,时间可能不同。也许这会触发代码中的死锁

如果可以附加调试器,请查看正在运行的线程。如果你能看到每个线程在等待什么,以及它还有什么锁(你可以用Java实现,但不确定你的应用程序),这可能会帮助你确定它在哪里消亡。

大多数时候(俗话说)

这听起来确实很像某种竞赛或僵局


您当然可以检查MSDN中的已知错误。根据您的代码是什么样的,当我真的被一个bug困扰时,我发现删除代码块直到只剩下一个最小的测试用例通常会有所帮助。

应用程序中不会发生任何奇怪的事情。依赖系统“停止工作”,因为系统所依赖的UI线程都很忙。这都是关于不同Disparcher对象的优先级。我可以考虑使用后台进程DOE来延长操作,而所有的同步都在UI线程中完成。 此外,还可以使用任务优先级(DispatcherPriority枚举作为Invoke/BeginInvoke方法的第一个参数) 另一个技巧,可以帮助您实现DoEvent模式,这是WinForms中的已知模式(用于处理windows队列中的消息)
总之,你应该记住,你在STA工作。此外,当您在Windows XP中使用ElementHost时,实际上删除了硬件加速。尝试使用.NET 3.5 SP1以某种方式修复它,但您仍然必须离开CPU来渲染和分派内容。

没有关于如何在启动时加载数据的详细信息。。。如果还没有完成,请考虑使用<代码>分派器。 是一篇关于如何做到这一点的帖子


注:如果绑定到的对象是一个
可观察集合
。。。阅读更多有关我在执行此操作时遇到的问题的信息

您是否在工作进程中使用线程?UI线程上没有发生与WPF相关的所有事情。(创建和应用动画设置属性等)如果我尝试在UI线程会导致异常的任何其他对象上设置属性,则会影响WPF。如果您有任何绑定对象,则还必须在UI线程上更改它们。尽管我怀疑这就是问题所在。您好@bitbonk我们的应用程序面临着完全相同的问题,您找到解决方案了吗?解决办法?谢谢。有趣的是windows窗体控件被正确地重新绘制。我可以正确地看到wpf控件,即使这些控件无效并被重新绘制,但当我更改它们的属性时,所包含的wpf元素不会更新。在wpf中,没有重新绘制(或等效),它是一个Direct3D窗口。但这里的实际问题是启动后(CPU使用率高)CPU使用率下降到1-2%,但WPF控件仍然没有更新-调度程序似乎不再执行其任务动画值没有增加,因此视图没有更新)。我已经使用.NET SP1从两天前开始清理新的修补程序。您确定在“高CPU启动”期间没有停止任何操作吗。请尝试启用异常处理(在VS Debug->exception->check VS there中)并查看是否一切正常实际上启动时没有要加载的数据,只是复杂的控件。它们通过直接在windows窗体用户控件上设置一些属性来更改其外观(wich将应用于包含的WPF用户控件的类似属性)在mu