2016-08-24 11 views
2

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

В настоящее время он подключает устройство USB для сбора данных, которое остается в состоянии безответственности из-за несовпадения устройства.

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

  1. Есть событие, которое всегда запускается экземпляром приложения?
  2. Могу ли я создать поток, который переживает экземпляр приложения и отправляет сообщение device.Disconnect()?
+0

Хмм ... напоминает мне о [«ИСТИНА ВСЕГДА исполняет» легенду] (http://thedailywtf.com/articles/My-Tales). Не совсем справедливо сравнивать с вашим вопросом, так как у вас есть некоторые разумные ожидания. – JDB

+0

@JDB это была хорошая сказка! Ну, вытаскивание вилки немного экстремально, но «Прекратить работу с диспетчером задач» или даже с ошибкой переполнения стека - это некоторые вещи, которые я хотел бы рассмотреть. Даже если ответ «нет, чувак», потому что как таковой я бы разобрал ситуацию и искал другой способ решить проблему. – heltonbiker

ответ

2

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

Это говорит о том, что это приводит ко второму вопросу: из вашего описания кажется, что «другой процесс» решительно завершает вашу программу. Зачем? Есть более изящные способы выхода из программы. По крайней мере, просто отправить WM_CLOSE в главное окно, как если бы пользователь был нажать кнопку «Закрыть» кнопку , нажав Alt + F4 и т.д. Еще лучше, обеспечивают некоторый тип связи между процессами (например, named pipe), чтобы родительский процесс мог предоставить определенные команды, в том числе один для закрытия, вашей программе.

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

Одним из вариантов было бы написать еще одну программу - «сторожевой таймер», которая контролирует состояние вашей программы. Если ваша программа завершена, тогда сторожевой таймер может очистить USB-устройство. Но это не панацея; кто-то может также убить сторожевой процесс и оставить вас там, где вы начали.

Но если вы можете устроить так, что даже наименьшее количество сотрудничества между другим процессом и вашим, то вы можете воспользоваться обычными механизмами, такими как Application.Exit события или окна Closing или Closed события.

+0

Perfect. Ваш третий абзац был чем-то, на что я хотел бы быть уверен, спасибо. Второй и четвертый абзацы содержат правильный путь действия в этом случае, потому что я могу организовать вещи (то есть «я владею кодом» таким образом), как вы говорите.Третий вариант был бы хорошей альтернативой, если бы я не имел доступа к исходному коду программы, заканчивающей процесс WPF. Большое спасибо! – heltonbiker

 Смежные вопросы

  • Нет связанных вопросов^_^