我正在寻找提高代码性能的方法。我有一个带有文本框和图形的 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/