Проблемы запуска приложения .net wpf - PullRequest
0 голосов
/ 14 марта 2011

У меня довольно странное поведение при запуске моего приложения.

При первом запуске приложения процесс занимает одно ядро ​​ЦП (50% на двухъядерном, 25% на четырехъядерном), и потребление ОЗУ останавливается на определенном значении (каждый запуск одинаковый, отличается на других машинах / отличается сборки версий, когда мы меняем приложение для тестирования).

Если я запускаю другой экземпляр во время работы первого, второй экземпляр запускается нормально.

Я вставил некоторые записи в приложение, и кажется, что приложение вылетает при первом отображении элемента пользовательского интерфейса. Первоначально запись в журнал закончилась незадолго до появления заставки - после удаления заставки она остановилась, так как должен отображаться элемент управления Messagebox.

Проблема возникает на некоторых машинах, а не на всех. Копирование тех же файлов на другой компьютер может «решить» проблему. Если я разверну скомпилированную отладочную сборку, собранную на моей рабочей станции, проблема полностью исчезнет.

Дополнительная информация (18 марта): Необходимое количество "зависших" экземпляров зависит от количества доступных ядер.

Если машина работает в системе двухъядерный *, запускается второй процесс , первый из которых занимает 50% ЦП (= 1 ядро ​​@ 100%). Если машина работает в системе четырехъядерный , то запускается * четвертый процесс, первые три занимают по 25% ЦП каждый (= 3 ядра при 100%).

Обновление (19 марта): Итак ... мы решили это! Коллега написал менеджер потоков с некоторым кодом для ожидания чего-либо. Этот менеджер вызывается, когда отображаются элементы пользовательского интерфейса. Запуск отладочной версии или запуск версии выпуска на очень медленной виртуальной машине (машина, которая работала нормально, была виртуальной на очень занятой машине), похоже, изменяет время и заставляет его работать.

Он сказал, что установил какое-то время ожидания, чтобы исправить это.

В понедельник я подробнее расскажу о его решении (и почему такие странные вещи требуются) и выложу здесь обновление, чтобы обеспечить правильное решение моего вопроса для следующих посетителей.

Щедрость достается Стивену Чангу, спасибо всем за помощь.

Ответы [ 3 ]

1 голос
/ 19 марта 2011

Да, вы должны нацеливаться на все те же версии среды выполнения, также вы должны посмотреть на fusion log (журналы загрузчика .NET, пытающегося получить правильную версию ваших двоичных файлов).

Проверьте Блог Сюзанны У нее много информации о проблемах с производительностью холодного запуска / настройке.

1 голос
/ 18 марта 2011

Ваш вопрос не очень понятен.Вы должны попытаться предоставить как можно больше информации журнала отладки / ошибок.

Подсказка ниже

Однако, учитывая, что вы используете 100% ядра процессора, это звучит подозрительно.Вы нанизываете темы?Вы используете ThreadPool?Для работы .NET-программ требуется по крайней мере несколько запасных потоков ThreadPool - пару лет назад было так, что если вы включили потоки в ThreadPool (запускали бесконечные циклы и т. Д.), А также количество свободныхтемы упадут ниже 3, система рухнетВы должны проверить количество свободных тем в ThreadPool, если это то, что вы используете.

Это всего лишь догадка.

Обобщение проблемы

Однако япытаясь подвести итог вашей проблемы ниже.Посмотрите, правильно ли я понял:

  1. Программа будет загружать 100% процессорного времени на одном только ядре - что предполагает только один единственный поток (как болеепотоки будут запланированы на другом процессоре) - что вы делаете с этим бедным ядром процессора, которое будет так напрягаться ??? !!!Вы иногда делаете System.Threading.Thread.Sleep (), чтобы вернуть процессорное время системе?Вы отметили ваш процесс как приоритет фона вместо высокого?
  2. n-1 экземпляры программы будут работать нормально (n = количество ядер).
  3. Сбой n-го экземпляра программы (n = количество ядер).
  4. Ошибка всегда связана с невозможностью открыть окно в пользовательском интерфейсе Windows.

Шаблон сбоя

Этот шаблон предполагает, что, когда ваша последняя программа загружается на 100% времени на последний ЦП, процессы Windows остаютсяборьба за процессорное время.

Если у вас есть одно свободное ядро, то процессы Windows всегда могут работать на этом ядре, и ваш пользовательский интерфейс будет отзывчивым.После того, как вы это сделаете, вы можете увидеть тайм-аут, обнаруженный Windows для не отвечающих приложений - возможно, вы настолько напрягаете компьютер, что Windows не может работать.

Для тестирования: Запустите n экземпляров программы (n = количество ядер).Затем запустите другие программы.Будут ли они вялыми или будут работать нормально?

0 голосов
/ 18 марта 2011

Попробуйте удалить код запуска приложения.Если проблема проявляется еще до того, как появится заставка, либо у вас есть код, который останавливает машину, либо что-то не так в WPF.

Запускаете ли вы какой-либо код в конструкторе объектов приложения?

...