【问题标题】:WPF application freezes Windows 7WPF 应用程序冻结 Windows 7
【发布时间】:2011-11-07 03:34:54
【问题描述】:

我在 Windows 7 64 位上有一个 .NET 3.5 WPF 应用程序。我在拖动和移动主应用程序窗口时遇到奇怪的系统冻结问题。基本上整个系统冻结(UI)并且应用程序停止渲染。 启动任务管理器 (CTRL+ALT+DEL) 会解冻系统和应用程序。

应用程序本身是一个交易应用程序,在后台线程中处理大量消息。

有没有人遇到过此类问题?尤其是任务管理器解锁冻结的奇怪之处。这种奇怪行为的原因可能是什么?

我几乎可以肯定它与将某些操作分派到 UI 线程有关。

【问题讨论】:

  • 是的,我体验过 CTRL+ALT+DELETE 解冻冻结的系统。
  • Favorite-ed : 哦...我现在正在开发这种 WPF 应用程序,我最不想做的就是冻结操作系统。我对这方面的任何数据感兴趣(即这个问题的潜在来源/解决方案)
  • @David:在你的案例中系统冻结的根本问题是什么?
  • 你的问题只问有没有其他人经历过。不问为什么会这样!我在调试时往往会注意到它,因此对于生产代码来说并不是真正的问题。
  • 对不起,我认为这是明确的,我正在寻找原因。我在生产中也遇到了这个问题。

标签: c# .net wpf multithreading


【解决方案1】:

在 StackOverflow 上找到了一些可能有帮助的旧帖子,据说可能是由于字体缓存。

“我遇到了同样的问题。这是一个损坏的字体缓存!

请参阅http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/7cc032c1-5f4d-4518-adc6-f53afd051e6b 以获得解决方案。

"

WPF Application Hang

这是要求采取的步骤。

在 Win 7 中

1. Run services.msc
2. Stop Windows Presentation Foundation Font Cache 3.0.0.0 service
3. Delete FontCache3.0.0.0.dat 

 in XP: 
%systemdrive%\Documents and Settings\LocalService\Local Settings\Application Data 

in Vista: %windir%\ServiceProfiles\LocalService\AppData\Local

4. Restart the machine

我所知道的是您可以执行以下操作。

Windows 操作系统有一个字体缓存文件位于此处:C:\Windows\System32\FNTCACHE.DAT

删除此文件,然后重新启动系统。

【讨论】:

    【解决方案2】:

    由于 WPF 使用 DirectX,您还应该确保 DirectX 和您的视频驱动程序是最新的并且可以正常工作。有故障的视频卡或视频驱动程序可能会导致 WPF 出现问题,而这些问题可能不会在其他 Win32 应用程序中出现。

    【讨论】:

      【解决方案3】:

      如果您使用 VS2010 并在 Win 7 64 位中运行 WPF 应用程序,您的问题的答案可能是这个:

      通过改变视觉体验提高性能

      您可能在 VS2010 中遇到硬件加速问题。因此,我在渲染使用 WPF 构建的应用程序时遇到了问题。

      试试看:http://blogs.msdn.com/b/zainnab/archive/2010/06/22/improving-performance-by-changing-the-visual-experience-vstipenv0017.aspx

      如果这不能解决您的问题,请转到您的视频卡设置(nvidia 或 amd)并执行“重置设置”。然后再试一次。

      【讨论】:

      • 此问题在 VS2010 和生产环境中均出现(通过 ClickOnce 发布)
      【解决方案4】:

      问题是 WCF 服务死锁。类似this的问题

      在处理消息的服务中,传入消息必须通过以下方式在 UI 线程上添加到集合中。

      Action action = new Action(() =>
                  {
                      lock (_messagesLock)
                      {
                          _messages.Remove(message);
                      }
                  });
                  _dispatcher.Invoke(DispatcherPriority.Normal, action);
      

      变化

      _dispatcher.Invoke(DispatcherPriority.Normal, action);
      

      _dispatcher.BeginInvoke(DispatcherPriority.Normal, action);
      

      解决了这个问题。

      【讨论】:

      • 对于其他面临此问题的人来说,您的死锁可能在任何地方。您需要做的是在 Visual Studio 中 Break All,然后查看 Threads Window 并检查每个线程的堆栈以查找哪些线程被卡住以及原因。在此处查看更多详细信息:stackoverflow.com/questions/1147387/how-to-debug-a-deadlock
      猜你喜欢
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      相关资源
      最近更新 更多