Что делать при сбое метода утилизации? - PullRequest
5 голосов
/ 09 августа 2011

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

Я использую приложение C # в сочетании с проприетарным (не для меня) оборудованием для сбора данных, так что тут все уже сложно.

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

Конечно, метод .Dispose () на моем объекте (объект интерфейса с оборудованием), который завершает соединение, ничего не делает, и фактически просто навсегда блокируется на месте, когда я пытаюсь его запустить. Очевидно, существует некоторая связь, которая никогда не прерывается в методе утилизации, которая требует, чтобы устройство было подключено, когда происходит отключение. Я не писал метод, поэтому я не знаю.

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

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

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

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

Ответы [ 3 ]

9 голосов
/ 09 августа 2011

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

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

1 голос
/ 09 августа 2011

Этот вопрос, вероятно, должен называться "Что мне делать, когда я имею дело с Dispose() методом, который я не могу изменить, и он был написан без учета очень реального и очень тревожного сценария реального мира?" И мое предложение было бы написать лучше!

Самый простой подход - создать оболочку для объекта, который будет удален, и затем вызвать GC.SuppressFinalize(internalConnectionObject);, если вы обнаружили, что соединение разорвано. Таким образом, если он не отзывчив, он не застрянет, но если он там, он будет правильно утилизирован. Изоляция - ваш друг, когда у вас есть проблемные компоненты.

1 голос
/ 09 августа 2011

Если предположить, что проблема заключается в Dispose() и что существует правильная реализация шаблона IDisposable, в которой финализатор вызывает Dispose() Я думаю, что решением может быть вызов GC.SupressFinalize(objWithFailingDispose), чтобы предотвратить вызов Dispose на все.

Это ужасно, но я могу работать.

...