【发布时间】:2017-01-25 01:55:47
【问题描述】:
小故事: 我正在设计软件来验证 CAD 应用程序中的某些内容。当我尝试并行时,它只会在 WPF 中变得非常慢。
长篇大论: 我的软件会询问我也制作的库 (.dll) 的问题,并且该库与我的 CAD 软件(来自 Zuken 的 E3.series)进行通信。
我的软件最初是用 WinForms 制作的,一切都很好,但我认为界面会因为绑定而真正受益于 WPF。所以我去翻译了那个,但发现它的速度很慢。所以我做了 2 个迷你项目来找到它变得慢得多的地方。以下是结果,我找不到原因:
这段代码和 Winforms 一样快(3.5 秒):
private void Grid_Loaded(object sender, RoutedEventArgs e)
{
Stopwatch timer = new Stopwatch();
timer.Start();
List<Wire> wires = e3.Project.Wires;
timer.Stop();
MessageBox.Show("WPF " + wires.Count + " in " + timer.Elapsed);
}
但是当我这样做时(12 秒):
private void Grid_Loaded(object sender, RoutedEventArgs e)
{
Task.Run(() =>
{
Stopwatch timer = new Stopwatch();
timer.Start();
List<Wire> wires = e3.Project.Wires;
timer.Stop();
MessageBox.Show("WPF " + wires.Count + " in " + timer.Elapsed);
});
}
BackgroundWorker 完全一样。
我需要使用Task.Run 和Parallel.ForEach,因为我有很多长任务要并行化。当我更改为 Parallel.ForEach 时,我的 WinForms 应用程序的速度提高了 5-6 倍,所以我不想失去切换到 WPF 的收益。
我看到我的 CPU 在空的 WPF 窗口中运行得更高,因此可能是没有足够的 CPU 让我的 CAD 应用程序工作并回答我的 dll?
我认为我在 VS2015 中使用 CPU 使用率分析器发现的是,由于我的应用程序,从我的库到我的 CAD 软件的 COM 调用确实慢了很多。
【问题讨论】:
-
由于绑定而真正受益于 WPF -
Winforms也支持绑定
标签: c# .net wpf winforms performance