Рассказ: Я разрабатываю программное обеспечение для проверки некоторых вещей в приложении САПР. Когда я пытаюсь параллелизм, он очень медленный в WPF.C# Task.Run замедляет мою программу wpf
Длинная история: У меня есть мое программное обеспечение, которое задает вопросы о моей библиотеке (DLL), которые я также сделал, и эта библиотека взаимодействует с моим программным обеспечением САПР (E3.series from Zuken).
Мое программное обеспечение было первоначально создано в 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
, потому что у меня много длинных задач для распараллеливания. Мое приложение WinForms получилось в 5-6 раз быстрее, когда я изменился на Parallel.ForEach
, поэтому я не хочу потерять эту выгоду для перехода на WPF.
Я вижу, что мой процессор работает выше с пустым окном WPF, так что может быть, что для моего приложения САПР не хватает процессора для работы и ответа на мою DLL?
Что я думаю, что с помощью анализатора использования процессора в VS2015 я обнаружил, что это действительно COM-вызов из моей библиотеки для моего программного обеспечения САПР, которое намного медленнее из-за моего приложения.
_would действительно извлечь выгоду из WPF из-за binding_ - 'поддержку Winforms' связывания, а также – Fabio