【问题标题】:C# WPF GUI performance MVVMC# WPF GUI 性能 MVVM
【发布时间】:2015-09-30 16:01:20
【问题描述】:

我正在寻找一种方法来提高我的代码的性能。我有一个带有文本框和图表的 WPF GUI(来自 OxyPlot 包)。我使用 StopWatch 来查找代码效率较低的地方,我发现更新 TextBox 的 Text 比填充字符串需要更多时间。比如MyText属性绑定到TextBox的Text属性,那么这部分代码

Application.Current.Dispatcher.Invoke(()=>{
   MyText = currentString;
});

花费的时间比所有这些都多

StringBuilder sb = new StringBuilder();
RetrieveDataFromDevice();
FillString(sb);
string currentString = sb.ToString();

还有秒表:

Task.Factory.StartNew(() =>
{
   var sw = new StopWatch();
   sw.Start();
   StringBuilder sb = new StringBuilder();
   RetrieveDataFromDevice();
   FillString(sb);
   string currentString = sb.ToString();
   Trace.WriteLine(sw.ElapsedMilliseconds.ToString()); //5ms
   sw.Restart();
   Application.Current.Dispatcher.Invoke(()=>{
      MyText = currentString;
   });
   Trace.WriteLine(sw.ElapsedMilliseconds.ToString()); //10ms
}

存在性能问题,因为我无法每 15 毫秒刷新一次字符串(或图表)。有什么方法可以提高这些性能吗?

【问题讨论】:

  • 为什么要更新用户界面的频率超过 15 毫秒?人眼无法感知这样的频率。
  • 关键是当我想更快地运行以供以后分析时,我必须禁用 GUI 更新(因为我的数据也保存到文件中)。我曾经降低频率,但由于我希望在我的数据上看到更快的现象,我试图减少两次测量之间的延迟,我注意到 GUI 是瓶颈。解决方案是禁用 GUI 刷新,但我想探索其他解决方案。谢谢!

标签: c# wpf multithreading mvvm


【解决方案1】:

尝试使用Dispatcher.BeginInvoke 方法而不是Invoke 方法。

此方法在继续之前不会等待 UI 线程处理请求。它只是将请求放入 UI 线程的队列中,然后立即返回。

这将允许您在 UI 线程处理 UI 请求时在后台线程中进行更多处理。

话虽如此,您要求 UI 线程每秒处理的 UI 更新请求数量应该是合理的。

【讨论】:

  • 我想知道为什么我的所有过程都是同步的……真丢脸。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 2011-06-25
  • 2017-02-20
  • 1970-01-01
  • 2012-10-20
  • 2018-06-15
相关资源
最近更新 更多