C# WPF GUI性能MVVM

3

我希望找到一种提高代码性能的方法。 我有一个带有TextBox和图形(来自OxyPlot包)的WPF GUI。 我使用了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毫秒?人眼无法感知这样的频率。 - Hamlet Hakobyan
重点是当我想要以后进行更快的分析时(因为我的数据也保存在文件中),我必须禁用GUI更新。我曾经降低过频率,但由于我想在我的数据上看到更快的现象,我尝试减少两次测量之间的延迟,并注意到GUI是瓶颈。解决方案是禁用GUI刷新,但我想探索其他解决方案。谢谢! - GuillaumeA
1个回答

4

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

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

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

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


我一直在想为什么我的所有进程都是同步的... 真丢人。谢谢! - GuillaumeA

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