Ошибки приложения WPF и .Net Framework

Фон: У меня есть приложение .NET 3.5 WPF "Prism", работающее на компьютерах Windows XP и Windows PosReady 2009. Приложение работает на компьютерах, которые закрываются каждую ночь (через вызов С# на "shutdown.exe" ) и загружаются свежими утром (через Wake-on-LAN). Приложение имеет сенсорный интерфейс (с использованием сенсорных экранов ELO), нет подключенных мышей или клавиатур, и пользователи не имеют доступа к Windows.

Вопрос: Мы спорадически видим проблемы, когда происходит одна из двух вещей; либо приложение, похоже, не загружается правильно, и мы видим пустую белую форму, или она перестает отвечать на прикосновение. Из поиска в наших журналах (log4net) мы видим, что мы все еще обрабатываем события касания и записываем их в обоих случаях. Часто это происходит при переключении просмотров, и мы также видим в журналах, где Prism RegionManager удаляет и добавляет представления соответствующим образом.

Устранение неполадок: Приложение работает на ~ 100 ПК с использованием изображений, примененных с помощью Clonezilla, и это происходит только спорадически. Поскольку это не происходит на всех компьютерах, и в журнале событий нет никаких исключений или что-либо, указывающее на проблему, мы прибегали к исправлениям на уровне ПК и ОС. В частности, мы попытались перезапустить приложение и ПК со случайным кратковременным успехом - это означает, что иногда приложение будет работать правильно после этих перезапуска, но только в течение нескольких часов. Мы также работали в предположении, что приложение каким-то образом было повреждено, и мы удалили и переустановили его без успеха.

Единственное, что, похоже, решает проблему, - это восстановление .Net-инфраструктуры с помощью предоставленного пакета установки .NET 3.5 SP1.

Заключение: Поскольку это, как представляется, устраняет проблему, когда ничего не делает, похоже, что мы каким-то образом искажаем dll оболочки GAC'd - либо через код, либо процедуры загрузки/выключения на ПК.

Вопросы: Это приводит к ряду вопросов:

  • Любые идеи о том, как мы можем еще больше определить источник проблемы?
  • Любые идеи о том, что мы можем сделать, чтобы предотвратить эту проблему?
  • Любые идеи о том, что может быть основной проблемой?

Спасибо за любую помощь.

Ответ 1

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

Служба кэширования шрифтов WPF Windows иногда попадала в поврежденное состояние, в результате чего простой запрос кеша блокировался бесконечно. Это зависание вызвало все описанные выше действия в нашем приложении WPF.

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

Обратите внимание, что существуют две версии службы: 3.0.0.0 и 4.0.0.0. Если ваше приложение нацелено на .Net 3.0 или 3.5, вам нужно отключить службу 3, а при таргетинге 4.0+ вам нужно отключить службу 4.

Спасибо всем за ваши комментарии и предложения.

Ответ 2

У нас были проблемы с напоминанием о вашем с нашим приложением WPF при подключении сенсорных экранов. Это было связано с ошибкой в ​​рамках автоматизации в .Net. Это заставило наше приложение либо стать очень медленным, либо полностью повесить поток графического интерфейса.

Подробнее о проблеме можно узнать по адресу: http://social.msdn.microsoft.com/Forums/en-IE/windowsaccessibilityandautomation/thread/6c4465e2-207c-4277-a67f-e0f55eff0110

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

Это не реальный ответ, но так как у меня не хватает репутации? (Я думаю) Я не могу использовать функцию комментариев:)

Ответ 3

Попробуйте глобальную ошибку и посмотрите, что она производит.

 public partial class App : Application
    {   
        [STAThread]
        public static void Main()
        {
                var application = new App();

                application.DispatcherUnhandledException += 
                    new DispatcherUnhandledExceptionEventHandler(application_DispatcherUnhandledException);

                application.InitializeComponent();
                application.Run();
        }

        static void application_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
        {
            LogAndClose("Global exception: " + e.Exception.ToString());
        }

        public static void Log(string text)
        {
            try
            {
                System.IO.File.AppendAllText(Environment.CurrentDirectory + "\\Log.txt",
                    "[" + DateTime.Now.ToString("MM/dd/yy HH:mm:ss") + "] " + text + "\r\n");
            }
            catch { }
        }

        public static void LogAndClose(string text)
        {
            Log(text);

            try
            {
                Application.Current.Shutdown();
            }
            catch { }
        }
    }

Ответ 4

Вы пробовали удаленную отладку производственной системы?

Что нужно для удаленного отладки:

  • развернуть msvcmon.exe
  • сетевое соединение между вашей системой разработки и производства
  • убедитесь, что локальная и удаленная версия кода синхронизирована. Вы также можете построить на своей машине dev и xcopy развернуть свою сборку отладки на удаленную машину. Если это чистый код .net, это легко. Если у вас также есть код на С++, вы должны убедиться, что отладочные версии С++ dll находятся на рабочей машине. Или создайте версию выпуска и удаленную отладку.
  • настроить учетную запись пользователя, используемую для подключения. Это на самом деле немного сложно. Удаленные отладочные данные Google для нескольких советов.
  • Не забудьте отключить все брандмауэры!

Вы можете подключиться к уже запущенному процессу, но вы также можете запустить приложение изнутри visual studio.

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

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

Удачи!

Ответ 5

Попробуйте использовать ANTI-профилировщик, чтобы узнать, есть ли у вас утечка памяти. Вы можете легко узнать только с 2-недельной пробной версией, которую они дают.