C# .NET WPF应用程序随机卡死(WgxConnection_ShouldForceSoftwareForGraphicsStreamClient)

5
我使用以下库编写了一个WPF .NET应用程序(.NET 4.5):
  • System.Windows.Interactivity.dll
  • Microsoft.Practices.ServiceLocation.dll
  • GalaSoft.MvvmLight.Platform.dll
  • GalaSoft.MvvmLight.Extras.dll
  • GalaSoft.MvvmLight.dll
我使用了两个计时器:
  • 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... 的任何信息。是否有人有任何想法?
编辑:
刚刚在MediaSystem.cs中找到了代码片段"UnsafeNativeMethods.WgxConnection_ShouldForceSoftwareForGraphicsStreamClient();": https://referencesource.microsoft.com/#PresentationCore/Core/CSharp/System/windows/Media/MediaSystem.cs --> wpfgfx_v0400.dll
也许"RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;"可以改变行为?
2个回答

0

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

只需插入一个模数语句,检查 if(timer % 1000 == 0) 然后调用异步数据请求函数。

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

你在程序中是否使用了缩放或其他图形效果?

我的想法是,在那台机器上发生了某种驱动程序问题,它试图执行一种效果,但该系统的图形能力不足,由于某种原因无法启用软件渲染,然后陷入无限循环尝试执行此效果。


到目前为止,我还没有发现这台电脑与其他电脑在GPU方面有什么区别。我不使用任何图形效果,除了在后台工作时显示的“IsIndeterminate=true ProgressBar”。由于性能更好(默认为60fps),我将帧速率设置为20:Timeline.DesiredFrameRateProperty.OverrideMetadata(...我想知道在我的情况下是否真的需要硬件渲染。有可能通过设置ProcessRenderMode来禁用它。 - Matthias G
程序每天正常运行,但始终是在早上开始运行。然而,所描述的问题只会在几天之后出现... - Matthias G
你是在使用计时器来控制每秒帧数还是实际的显卡命令? - Slipoch
我不使用计时器来实现这个功能。我使用以下命令: Timeline.DesiredFrameRateProperty.OverrideMetadata(typeof(Timeline), new FrameworkPropertyMetadata { DefaultValue = 20 }); - Matthias G
时间轴是一种动画效果,这可能与轻微的驱动程序损坏一起导致了您的问题。我假设在您检查电脑时,您也检查了GPU驱动程序的版本和图形芯片/显卡型号?删除帧速率属性(或使用其他方法来实现同样的效果),看看会发生什么。 - Slipoch

0

没有看到代码示例很难确定问题。

以下是我能想到的几个要点:

  1. 重新检查代码,看是否有任何阻塞代码。请注意,因为您正在使用计时器,所以必须使用线程安全的列表实现(ConcurrentQueue、ConcurrentStack、ConcurrentBag)。
  2. 如果在除一台外的所有桌面电脑上都正常工作,请查看该PC是否有不同的GPU。WPF和可用的GPU驱动程序之间可能存在某些不兼容性。
  3. 尝试使用Dispatcher计时器而不是System.Timers.Timer。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接