use*_*628 5 .net c# wpf performance winforms
简短的故事:我正在设计软件来验证 CAD 应用程序中的某些内容。当我尝试并行时,仅在 WPF 中它变得非常慢。
长话短说:我的软件可以向我制作的库 (.dll) 提出问题,并且该库与我的 CAD 软件(Zuken 的 E3.series)进行通信。
我的软件最初是用 WinForms 制作的,一切都很好,但我认为由于绑定,界面会真正受益于 WPF。所以我去翻译了它,但发现它慢得多。所以我做了两个小项目来找出速度变慢的地方。这是结果,我找不到原因:
此代码与 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);
}
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时(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);
});
}
Run Code Online (Sandbox Code Playgroud)
这与 a 完全相同BackgroundWorker。
我需要使用Task.RunandParallel.ForEach因为我有很多长任务需要并行化。当我更改为 WPF 时,我的 WinForms 应用程序速度提高了 5-6 倍Parallel.ForEach,因此我不想失去切换到 WPF 所带来的好处。
我看到我的 CPU 在空 WPF 窗口中运行得更高,因此可能没有足够的 CPU 供我的 CAD 应用程序运行并响应我的 dll?
我想我在 VS2015 中的 CPU 使用分析器中发现,实际上是从我的库到我的 CAD 软件的 COM 调用,由于我的应用程序而慢了很多。
WinForm 和 WPF 应用程序 UI 都在静态线程单元 (STA) 模型中运行。您提到使用 Task.Run 或后台工作程序会降低性能。由于这两者都会创建多线程单元 (MTA) 线程,因此如果在 STA 中创建 COM 组件,则问题可能是由于封送处理造成的。有关详细信息,请参阅了解和使用 COM 线程模型的“混合模型开发”部分。
您可以尝试创建一个 STA 线程并在其上运行代码。
Thread t = new Thread(ThreadWorkMethod);
t.SetApartmentState(ApartmentState.STA);
t.Start();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1472 次 |
| 最近记录: |