Гарантированное выполнение кода даже при уничтожении процесса - PullRequest
21 голосов
/ 18 декабря 2010

Мне нужно выполнить часть кода (сохранение состояния) при остановке процесса - самостоятельно, пользователем, диспетчером задач и т. Д.

Возможно ли это?

try {} finally {}, AppDomain.ProcessExit, IDisposable, деструктор, .. что дальше попробовать?

Ответы [ 4 ]

17 голосов
/ 18 декабря 2010

Как уже отмечали другие, вы не сможете выполнить какой-либо код в вашем приложении, когда оно Killed на Operating System или User.Вот почему он называется Killing.

Если сохранение состояния является важной частью вашего приложения, вы должны использовать подход, аналогичный системе баз данных.Реализация transaction log, создание checkpoints и т. Д. Это самое близкое, что вы можете получить.

В том случае, когда ваше приложение восстанавливается (перезапускается после того, как killed), оно может проверить этиtransaction logs для любых ожидающих обновлений или последних изменений состояния.

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

11 голосов
/ 18 декабря 2010

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

2 голосов
/ 18 декабря 2010

Вам нужно подумать о том, почему ваша программа закрывается. Если это из-за ошибки, вы можете использовать try / catch. В терминах Unix то, что происходит, когда менеджер процесса останавливает процесс, - это уничтожение (то есть отправка сигнала SIGKILL), которое не позволяет программе делать что-либо до завершения процесса. Многие вирусы используют два процесса (возможно, с общей памятью, чтобы избежать постоянной синхронизации данных), каждый из которых отслеживает состояние другого, а когда один выходит из строя, другой вызывает его. Возможно, второй процесс мог бы отслеживать и сохранять состояние аналогичным образом для вашего случая. Другой вид сигнала, хотя и является SIGTERM. Этот сигнал отправляется, когда вы сообщаете компьютеру о перезагрузке, но процессы запущены. Ядро позволяет программам самостоятельно пытаться завершить работу, но в конечном итоге спросит пользователя, можно ли убить программу. Если вы хотите обрабатывать сигналы обработки поиска SIGTERM. В конечном счете, единственное известное мне решение для SIGKILL - это двухпроцессное решение.

1 голос
/ 04 октября 2018

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

ПРИМЕЧАНИЕ: для тех, кто знает, что этоэто, по сути, шаблон проектирования «Heartbeat».

1) В дополнение к выполняющемуся коду, который «умрет» (т.е. будет убит), добавьте код в этот проект так, чтобы он порождал поток (иливозможно, другой метод?) после инициализации, и все, что делает поток, это запускает бесконечный цикл while (но убедитесь, что он спит не менее нескольких секунд или даже 1 минуты между итерациями), и в цикле while запишите индикатор, чтобы указатьВаше приложение «живое» (т. е. «сердцебиение»).Я лично рекомендую установить значение в БД или, возможно, в файле, то есть текущую метку времени (т.е. DateTime.Now)

2) Теперь, когда вы записываете «сердцебиение», создайте другое приложение (т.е.другой процесс), который ничего не делает, но читает значение тактового импульса (т.е. текущую метку времени) и делает это в бесконечном цикле while.После того, как определено, что значение сердцебиения является «плохим» (то есть, может быть, если, скажем, HeartBeatTimestamp + 5 мин

Надеюсь, что это поможет :) Не стесняйтесь исследовать шаблон проектирования «Сердцебиение» из других ресурсов, если хотите узнать больше!

Приветствия,

Джефф

...