Ошибки приложения 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-недельной пробной версией, которую они дают.