2016-10-14 12 views
4

Так что это странно.C# WPF-приложение с MahApps, которое не отображается в Windows 2008

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

Клиент использует службы терминалов и Windows Server 2008R2. Несколько пользователей могут войти в свою версию сервера в любое время. Приложение запускается нормально один или два раза, но через день или около того он больше не открывается.

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

Если честно, я полностью в тупике. Я просмотрел журнал менеджера событий и не нашел ничего, что могло бы показаться проблемой. (Конечно, я мог пропустить что-то). Я увидел еще один вопрос SO, предлагающий отключить аппаратное ускорение, но я не уверен, что это поможет.

Любые идеи были бы весьма полезными.

EDIT: Я думал, что могу упомянуть единственное, что помогает, если мы перезапустим клиентскую машину.

EDIT: Я думаю, что я выделил проблему для интеграции с Twain (возможно, упомянул об этом как о другом возможном факторе). Я думаю, что библиотека Twain (неуправляемый код) каким-то образом кивает, не отправив обратно ошибку. Отключение этого «исправлено».

Это как-то связано с Twain и многосеансовыми настройками. Я почти уверен в этом.

+0

Вы проверили, правильно ли приложение закрывается, когда пользователь закрывает его, т. Е. Сохраняется ли вышеупомянутый процесс после закрытия приложения? Или процесс действительно появляется только там, когда приложение пытается начать? Причиной неработоспособности приложения могут быть службы терминалов. В отличие от других машин, здесь несколько пользователей будут запускать ваше приложение одновременно и могут не выходить из системы в течение более длительного периода времени, чем на клиентских машинах. –

+0

Невозможно проверить, что процесс был убит после того, как пользователи его закрыли. Но если я вручную уничтожу этот процесс, то одно и то же происходит снова и снова. Насколько я понимаю (что ограничено в случае служб терминалов), запуск нескольких копий моего приложения не должен быть проблемой? – Richard

ответ

1

Сначала вы можете проанализировать цепочку ожидания в Windows Resource Monitor, чтобы проверить, есть ли какие-либо ресурсы, которые ожидает процесс. (Дополнительную информацию о цепи ожидания here или here.)

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

То есть: Если ваше приложение является 64-битным, тогда вы должны использовать C:\Windows\System32\taskmgr.exe, и если это 32-разрядный, вы должны использовать C:\Windows\SysWOW64\taskmgr.exe. Если вы забудете этот важный шаг, вы просто получите непригодную свалку, полную тарабарщины.

После того, как вы получили дамп памяти, вы можете загрузить его в WinDbg (используя ту же битту, что и приложение), или Visual Studio (лучше всего использовать 2015 или позже) и проанализировать стеки вызовов всех запущенных потоков.

Вы можете скачать WinDbg here и прочитать о необходимой конфигурации WinDbg here. Для списка всех потоков вам нужно использовать команду this SOS.

Если вам нужна помощь в загрузке дампов памяти в Visual Studio, вы можете найти дополнительную информацию here.

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

И последнее, но очень не менее важное: если вам действительно интересно, что можно проанализировать, если приложение зависает, вы можете прочитать о примере анализа, сделанного абсолютно удивительным великим Марком Руссиновичем here.

+0

Это невероятный полезный ответ. Огромное спасибо. Я буду отмечать как принятый ответ, как только я обнаружил ошибку. – Richard

+0

@Richard Добро пожаловать. :-) Если я могу помочь вам в дальнейшем (или, по крайней мере, я могу попытаться вам помочь), просто оставьте комментарий. – haindl

+0

Чтобы дать некоторую обратную связь, процесс анализа не показал ничего необычного. Я изо всех сил пытаюсь заставить свалку работать, но подозреваю, что это поможет, когда я получу ее работу. – Richard