C# WPF GUI 性能 MVVM

标签 c# wpf multithreading mvvm

我正在寻找提高代码性能的方法。我有一个带有文本框和图形的 WPF GUI(来自 OxyPlot 包)。我使用 StopWatch 找到代码效率较低的地方,我发现更新我的 TextBox 的文本比填充字符串需要更多时间。例如,如果属性 MyText 绑定(bind)到 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 毫秒更频繁地刷新字符串(或图形)。有什么方法可以提高这些性能吗?

最佳答案

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

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

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

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

关于C# WPF GUI 性能 MVVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32870719/

相关文章:

c# - static RNGCryptoServiceProvider -- 生成 session 和随 secret 码是否安全且线程安全?

c# - Linq Getting Customers 按日期分组,然后按类型分组

c# - WPF 数据网格 : DataGridComboxBox ItemsSource Binding to a Collection of Collections

Java 锁条件

c++ - C++ 11 中的 sleep 排序

python - 使用 TCP/socket 将字符串列表从 Python 发送到 C#

c# - 从 WCF 中的通用契约(Contract)继承

wpf - 如何在 WPF 中实现搜索框的默认文本?

.net - WPF - 如何使文本垂直滚动并暂停

c++ - 覆盖线程函数c++