简短故事: 我正在设计软件,用于验证CAD应用程序中的某些内容。当我尝试使用并行处理时,在WPF中会变得非常慢。
长故事: 我的软件向我制作的库(.dll)提出问题,该库与我的CAD软件(E3.series from Zuken)通信。
我的软件最初是在WinForms中制作的,一切都很好,但我认为界面将因绑定而受益匪浅,所以我进行了翻译,但发现它的速度要慢得多。因此,我做了两个小项目,找到了它变得更慢的位置。以下是结果,但我找不到原因:
这段代码与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 窗口下运行得更高,所以可能是我的 CAD 应用程序没有足够的 CPU 来工作并回答我的 dll?
我认为我在 VS2015 中使用 CPU 使用情况分析器发现的是,由于我的应用程序,从我的库到我的 CAD 软件的 COM 调用变得非常慢。
Winforms
同样支持绑定。 - Fabio