【问题标题】:C# .NET WPF Application hangs randomly (WgxConnection_ShouldForceSoftwareForGraphicsStreamClient)C# .NET WPF 应用程序随机挂起 (WgxConnection_ShouldForceSoftwareForGraphicsStreamClient)
【发布时间】:2017-06-17 02:54:54
【问题描述】:

我使用以下库编写了一个 WPF .NET 应用程序 (.NET 4.5):

  • System.Windows.Interactivity.dll
  • Microsoft.Practices.ServiceLocation.dll
  • GalaSoft.MvvmLight.Platform.dll
  • GalaSoft.MvvmLight.Extras.dll
  • GalaSoft.MvvmLight.dll

我使用 2 个计时器:

  • System.Threading.DispatcherTimer(每 200 毫秒打勾)

    • 只需将绑定到标签的 DateTime 属性设置为 DateTime.Now。
  • System.Timers.Timer(每秒滴答声)

    • 将焦点设置到文本框,从 Web 服务请求数据(在异步任务中)
    • 更新绑定到 Datagrid 的 ICollectionView(使用 Application.Current.Dispatcher.BeginInvoke

应用程序在大约 50 台 Windows 7 机器上运行(从早上 7 点到下午 5 点),没有任何问题。

仅在 1 台 Windows 7 机器上,它只是随机冻结,CPU 使用率高且唯一活动线程:WgxConnection_ShouldForceSoftwareForGraphicsStreamClient

Windows 事件日志中没有条目,也没有触发此事件的用户事件。

我找不到关于此WgxConnection... 的任何信息有人有任何想法吗?

编辑:

刚刚找到sn -p "UnsafeNativeMethods.WgxConnection_ShouldForceSoftwareForGraphicsStreamClient();"在 MediaSystem.cs 中: https://referencesource.microsoft.com/#PresentationCore/Core/CSharp/System/windows/Media/MediaSystem.cs

--> wpfgfx_v0400.dll

也许“RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;”可以改变行为吗?

【问题讨论】:

    标签: c# .net wpf mvvm


    【解决方案1】:

    不看代码示例很难发现问题。

    这是我能想到的几点

    1. 重新访问代码并查看是否有任何阻塞代码。注意 因为您使用的是计时器,所以您必须使用线程安全列表实现(ConcurrentQueue、ConcurrentStack、ConcurrentBag)。
    2. 如果它在除一台以外的所有台式机上运行良好,则查看该 PC 是否具有不同的 GPU。 WPF 和可用的 GPU 驱动程序之间可能存在一些不兼容。
    3. 尝试使用 Dispatcher 计时器而不是 System.Timers.Timer。

    【讨论】:

      【解决方案2】:

      您的调度计时器也可以用来完成系统计时器的工作。

      只需在检查 if(timer % 1000 == 0) 时粘贴一个 if 模数语句,然后调用您的异步数据请求函数。

      关于主要问题,找出在一台电脑上有什么不同,是否使用相同的显卡,驱动程序如何?

      您是否在程序中的任何位置使用缩放或其他图形效果?

      我的想法是,某台机器上出现了某种驱动程序问题,它试图产生效果并且该系统上的图形无法运行,并且由于某种原因无法启用软件渲染,然后尝试执行该操作时卡住了这种效果在无限循环中。

      【讨论】:

      • 关于 GPU,我还没有发现这台 PC 和其他 PC 之间的区别。在后台工作完成时,除了显示的“IsIndeterminate=true ProgressBar”之外,我不使用任何图形效果。由于性能更好,我将帧速率设置为 20(默认 60fps): Timeline.DesiredFrameRateProperty.OverrideMetadata(... 我想知道在我的情况下是否真的需要硬件渲染。有可能将其停用,设置:ProcessRenderMode。
      • 程序每天都不间断运行,但每天早上都是startet。所描述的问题每隔几天就会出现一次......
      • 你是在使用计时器来进行 fps 还是实际的显卡命令?
      • 我不为此使用计时器。我使用这个命令:Timeline.DesiredFrameRateProperty.OverrideMetadata(typeof(Timeline), new FrameworkPropertyMetadata { DefaultValue = 20 });
      • 时间轴是一种动画效果,这与轻微的驱动程序损坏相结合可能会导致您的问题。我假设当您检查电脑时,您还检查了 GPU 驱动程序的版本和图形芯片组/卡的型号?删除 framerate 属性(或使用其他方法来实现同样的事情),看看会发生什么。
      猜你喜欢
      • 1970-01-01
      • 2011-02-10
      • 2013-05-23
      • 2013-03-04
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      相关资源
      最近更新 更多