Как перезапустить приложение c
Каков лучший способ перезапустить приложение?
ОТВЕТЫ
Ответ 1
К сожалению, вы не можете использовать Process.Start() для запуска экземпляра текущего процесса. В соответствии с документами Process.Start(): "Если процесс уже запущен, никакой ресурс процесса не запускается. "
Этот метод будет работать отлично под отладчиком VS (потому что VS делает какую-то магию, которая заставляет Process.Start думать, что процесс еще не запущен), но не будет работать, если не будет запущен под отладчиком. (Обратите внимание, что это может быть специфично для ОС - я, кажется, помню, что в некоторых моих тестах он работал либо с XP, либо с Vista, но я могу просто помнить, как его запускать под отладчиком.)
Этот метод точно такой, который используется последним программистом в проекте, над которым я сейчас работаю, и я пытался найти обходное решение для этого в течение довольно долгого времени. До сих пор я нашел только одно решение, и он просто чувствует себя грязным и глупым для меня: запустите второе приложение, которое ждет в фоновом режиме для первого приложения, которое завершает работу, а затем перезапускает первое приложение. Я уверен, что это сработает, но, yuck.
Изменить: работает 2-я прикладная программа. Все, что я сделал во втором приложении:
(Это очень упрощенный пример. Реальный код имеет множество проверок работоспособности, обработки ошибок и т.д.)
Ответ 2
Если вы находитесь в основной форме приложения, попробуйте использовать
Ответ 3
Более простой подход, который работал у меня, это:
Это сохраняет аргументы командной строки и работает, несмотря на обработчики событий, которые обычно предотвращают закрытие приложения.
Вызов Restart() пытается выйти, все равно запускает новый экземпляр и возвращается. Затем вызов Exit() завершает процесс, не давая возможности обработчикам событий. Очень короткий период, в котором работают оба процесса, что не является проблемой в моем случае, но, возможно, в других случаях.
Код завершения 0 в Environment.Exit(0); указывает на чистое завершение работы. Вы также можете выйти с 1 для указания произошедшей ошибки.
Ответ 4
Я могу опаздывать на вечеринку, но вот мое простое решение, и оно работает как шарм с каждым приложением:
Ответ 5
У меня была такая же точная проблема, и у меня также было требование предотвратить дублирование экземпляров - я предлагаю альтернативное решение для того, что предлагает HiredMind (что будет работать нормально).
То, что я делаю, - это запуск нового процесса с помощью processId старого процесса (тот, который запускает перезапуск) в качестве аргумента строки cmd:
Затем, когда запускается новое приложение, я сначала разбираю аргументы cm line и проверяю, есть ли флаг перезапуска с processId, а затем дождаться завершения этого процесса:
Я, очевидно, не показываю все проверки безопасности, которые у меня есть, и т.д.
Даже если это не идеальный вариант, я считаю это подходящей альтернативой, так что вам не нужно иметь отдельное приложение, чтобы обрабатывать перезапуск.
Ответ 6
Простой вам просто нужно вызвать методы Application.Restart() , которые имеют тенденцию вызывать ваше приложение для перезапуска. Но вам придется выйти из локальной среды с кодами ошибок:
вы можете создать перечисление кода ошибки, чтобы вы могли использовать его эффективно.
Еще один метод - просто выйти из приложения и запустить процесс с исполняемым путем:
Ответ 7
Метод запуска/выхода
Это работает лучше, чем Application.Restart();
Не знаете, как это работает, если ваша программа защищает от нескольких экземпляров. Я предполагаю, что вам лучше запустить второй .exe, который приостанавливается, а затем запускает ваше основное приложение для вас.
Ответ 8
Попробуйте этот код:
Этот код также должен быть в функции:
Ответ 9
Я понял другое решение, возможно, кто-то может его использовать.
Кодекс упрощен, поэтому позаботьтесь об исключениях и прочее;)
Ответ 10
Вы забываете параметры/параметры командной строки, которые были переданы вашему текущему запущенному экземпляру. Если вы не проходите мимо, вы не выполняете реальный перезапуск. Задайте параметры Process.StartInfo с параметрами клона вашего процесса, затем запустите.
Например, если ваш процесс был запущен как myexe -f -nosplash myfile.txt , ваш метод выполнил бы только myexe без всех этих флагов и параметров.
Ответ 11
Вы также можете использовать Restarter.
Restarter - это приложение, которое автоматически контролирует и перезапускает разбитые или зависающие программы и приложения. Он был первоначально разработан для мониторинга и перезапуска игровых серверов, но он будет выполнять задание для любой программы или приложения на основе консоли или формы.
Ответ 12
Я хотел, чтобы новое приложение запускалось после того, как старый отключился.
Использование process.WaitForExit() для ожидания выключения вашего собственного процесса не имеет смысла. Он всегда будет тайм-аут.
Итак, мой подход заключается в использовании Application.Exit(), затем подождите, но разрешите обработку событий в течение определенного периода времени. Затем запустите новое приложение с теми же аргументами, что и старые.
Ответ 13
Application.ExecutablePath возвращает ваш путь к файлу aplication.exe Пожалуйста, следуйте порядку звонков. Возможно, вы захотите разместить его в предложении try-catch.
Ответ 14
Здесь мои 2 цента:
Последовательность Start New Instance- > Close Current Instance должна работать даже для приложений, которые не позволяют запускать несколько копий одновременно, так как в этом случае новому экземпляру может быть передан аргумент командной строки, который указывает, что существует перезагрузка выполняется, поэтому проверка других запущенных экземпляров не требуется. Ожидание того, что первый экземпляр действительно завершит мою реализацию, тоже необходимо, если абсолютно необходимо, чтобы не было двух параллельных операций.
Ответ 15
Я боюсь, что перезапуск всего приложения с помощью Process неправильно подходит к вашей проблеме.
Более простой способ - изменить файл Program.cs для перезапуска:
Ответ 16
У меня была аналогичная проблема, но моя была связана с неуправляемой утечкой памяти, которую я не мог найти в приложении, которое должно работать 24/7. С клиентом я согласился с тем, что безопасное время для перезапуска приложения было 03:00, если потребление памяти превысило определенное значение.
Я попробовал Application.Restart , но, поскольку он, похоже, использует какой-то механизм, который запускает новый экземпляр, пока он уже запущен, я пошел на другую схему. Я использовал трюк, который обрабатывает файловая система, до тех пор, пока не завершится процесс их создания. Таким образом, из приложения я удалил файл на диск и не выполнил Dispose() дескриптор. Я использовал файл для отправки "сам" исполняемого файла и стартового каталога (чтобы добавить гибкость).
Close() в конце будет инициировать завершение работы приложения, а дескриптор файла, который я использовал для StreamWriter , здесь будет оставаться открытым до тех пор, пока процесс не начнет умирать. Тогда.
Restarter.exe вступает в действие. Он TRIES читает файл в эксклюзивном режиме, не позволяя ему получить доступ до тех пор, пока основное приложение не будет мертвым, затем запустит основное приложение, удалит файл и будет существовать. Я предполагаю, что это не может быть проще:
Ответ 17
Как создать файл bat, запустить пакетный файл перед закрытием, а затем закрыть текущий экземпляр.
Пакетный файл делает это:
- Подождите в цикле, чтобы проверить, вышел ли процесс.
- запустите процесс.
Ответ 18
Я использую следующее, и он делает именно то, что вы ищете:
Ответ 19
для использования в качестве выхода из системы вы должны прекратить все приложения из Ram Cache так что сначала закройте приложение, а затем повторите его.
//при нажатии кнопки выхода
Ответ 20
Проблема использования Application.Restart() заключается в том, что он запускает новый процесс, но "старый" все еще остается. Поэтому я решил убить старый процесс, используя следующий фрагмент кода:
Ответ 21
Вы можете заключить свой код в функцию, а при необходимости перезапуска вы можете просто вызвать функцию.
Перезапуск программы
Скажите, пожалуйста, можно ли как-нибудь сделать перезапуск своей программы из нее же самой? Нужно.
Перезапуск программы
Как мне программно перезапустить приложение? Нужно чтобы программа перезапустила себя сам, при том.
перезапуск программы
пишу игру. в "конце поставил проверку, хотите ли запустить заново?" использовал кучу функций.
PS:Думаю ясно что консоли снизу при Release конфигурации не будет (приложение просто само себя убьёт, а останется лишь перезапущенная копия). Причём при рестарте через аргументы командной строки можно передать данные от предыдущего экземпляра программы (как бы установить новый экземпляр в место отработки предшественника) Я новичок в программировании. Как char * argv[] хранит в себе путь к файлу ? Я не понемаю даже * argv[], знаю только, что * - это, вроде, как указатель. Rusarch333, путь к файлу хранится в argv[0], argv сам по себе - массив указателей, которые в свою очередь указывают на какие-то данные, 0-ой по списку - на путь и имя программы.
А можно как-то сделать перезапуск, через:
Только вместо: "путь_к_фалу" была б переменная, которая б его определяла и хранила ?
Добавлено через 42 минуты
Всем спасибо ! Получилось !
Но мне нужно детальное объяснение работы кода для курсовой, объясните выражение:
1. Почему обязательно нужно об'являть: int argc ?
2. Что означает: char * ?
(приношу извинения за свою тупость)
Добавлено через 33 минуты
Вот ответ:
Первая типа int хранит количество передаваемых параметров, один из параметров - это обязательно имя программы (абсолютный путь), далее уже могут быть ваши параметры , если это ваша программа.
argv - это обычно массив char, но сейчас уже _TCHAR, причем указателей, но _TCHAR обычно в иде стоит как char, там уже имена переданных параметров, один - это программа, а остальные - это уже их порядок.
Как лучше перезапустить приложение?
Мне любопытно, нужно ли перезапустить ваше приложение. Я никогда раньше не думал об этой нужде. Каковы ваши обстоятельства? В конце концов, гораздо лучшим решением для нашего приложения была разработка небольшого приложения Watchdog, которое запускается (если еще не запущено) из основного приложения. Сторожевой таймер просто проверяет каждые 10 секунд или около того, чтобы увидеть, есть ли в основном приложении все еще запущенный процесс, и если нет, запускает его. Просто, элегантно и намного надежнее, чем пытаться перезапустить из основного приложения. Еще одна причина перезагрузки - это изменение языка или загрузка обновления.К сожалению, вы не можете использовать Process.Start () для запуска экземпляра текущего процесса. Согласно документации Process.Start (): «Если процесс уже запущен, никаких дополнительных ресурсов процесса не запускается . »
Этот метод будет нормально работать в отладчике VS (потому что VS выполняет какое-то волшебство, заставляющее Process.Start думать, что процесс еще не запущен), но потерпит неудачу, если он не запущен в отладчике. (Обратите внимание, что это может зависеть от ОС - я, кажется, помню, что в некоторых моих тестах он работал как на XP, так и на Vista, но, возможно, я просто вспомнил, как запускал его под отладчиком.)
Именно этот метод использовался последним программистом проекта, над которым я сейчас работаю, и я уже довольно давно пытался найти обходной путь. Пока что я нашел только одно решение, и оно мне кажется грязным и непонятным: запустить второе приложение, которое в фоновом режиме ждет завершения первого приложения, а затем повторно запускает первое приложение. Я уверен, что это сработает, но, черт возьми.
Изменить: использование второго приложения работает. Все, что я сделал во втором приложении, было:
(Это очень упрощенный пример. В реальном коде много проверок работоспособности, обработки ошибок и т. Д.)
Я согласен с HiredMind, и я фактически сам пошел с той же реализацией «программы сторожевого пса» вскоре после написания ответа. Извините, надо было вернуться сюда и обновить. Я не думаю , что он должен чувствовать себя слишком ужасно некрасиво / противный / грязный. Шаблон программы Watchdog довольно широко используется. Первый абзац не правильный: Process.Start не смотрит список запущенных процессов ОС. Эта документация утверждение говорит только о том , что объект , например из Process класса. Process Класс может быть присоединен к работающему процессу , но он также может быть в состоянии Не начато. На мой взгляд, это промах в дизайне. Лучшая практика, IMO, - никогда не использовать Process экземпляр повторно и сразу же запускать его после создания. В идеале используйте статический Process.Start метод. Тогда этот недостаток документации и дизайна никогда не вступит в игру. Показанный здесь код также ненадежен из-за WaitForExit(1000) . Но для того, чтобы начать новый процесс, совсем не обязательно ждать. Это может быть дополнительное поведение, которое вам нужно, но оно не требуется для запуска нового процесса. Не знаю, как сейчас, но девять лет назад (кхм) это определенно было правильно. :-)У меня сработал гораздо более простой подход:
Это сохраняет аргументы командной строки и работает, несмотря на обработчики событий, которые обычно предотвращают закрытие приложения.
Вызов Restart () пытается завершить работу, все равно запускает новый экземпляр и возвращается. Затем вызов Exit () завершает процесс, не давая возможности обработчикам событий запуститься. В течение очень короткого периода времени выполняются оба процесса, что не является проблемой в моем случае, но, возможно, в других случаях.
вышеуказанный метод имеет оказалось ненадежным.
Как лучше перезапустить приложение?
к сожалению, вы не можете использовать Process.Метод start() для запуска экземпляра процесса. Согласно процессу.Start () docs: "Если процесс уже запущен, дополнительный ресурс процесса не запускается. "
этот метод будет отлично работать под отладчиком VS (потому что VS делает какую-то магию, которая вызывает процесс.Начните думать, что процесс еще не запущен), но произойдет сбой, если он не будет запущен под отладчиком. (Обратите внимание, что это может быть OS-specific-I кажется, помните, что в некоторых моих тестах он работал либо на XP, либо на Vista, но я могу просто вспомнить его запуск под отладчиком.)
этот метод именно тот, который использовался последним программистом в проекте, над которым я сейчас работаю, и я пытался найти обходной путь для этого в течение некоторого времени. До сих пор я нашел только одно решение, и оно просто кажется мне грязным и kludgy: запустите 2-е приложение, которое ждет в фоновом режиме для первого приложения чтобы завершить, затем повторно запускает 1-е приложение. Я уверен, что это сработает, но, тьфу.
Edit: использование 2-го приложения работает. Все, что я сделал во втором приложении было:
(Это очень упрощенный пример. Реальный код имеет много проверки здравомыслия, обработки ошибок и т. д.)
Если вы находитесь в основной форме приложения, попробуйте использовать
гораздо более простой подход, который работал для меня:
это сохраняет аргументы командной строки и работает, несмотря на обработчики событий, которые обычно предотвращают закрытие приложения.
вызов Restart () пытается выйти, запускает новый экземпляр в любом случае и возвращает. Затем вызов Exit () завершает процесс, не давая возможности запустить обработчикам событий. Существует очень короткий период, в течение которого оба процесса работают, что не является проблемой в мое дело, но, возможно, в других случаях.
код выхода 0 в Environment.Exit(0); указывает чистое завершение работы. Вы также можете выйти с 1, чтобы указать произошла ошибка.
Я могу опоздать на вечеринку, но вот мое простое решение, и оно работает как шарм с каждым приложением, которое у меня есть:
у меня была такая же точная проблема, и у меня тоже было требование предотвратить дублирование экземпляров - я предлагаю альтернативное решение тому, что предлагает HiredMind (что будет работать нормально).
то, что я делаю, это запуск нового процесса с processId старого процесса (тот, который запускает перезапуск) в качестве аргумента строки cmd:
затем, когда новое приложение запускается, я сначала анализирую линии CM args и проверяю, есть ли флаг перезапуска с processId, затем дождитесь выхода этого процесса:
Я, очевидно,не показываю все проверки безопасности, которые у меня есть на месте и т. д.
даже если не идеально - я считаю это допустимой альтернативой, так что вам не нужно иметь на месте отдельное приложение только для обработки перезагрузки.
его просто вам просто нужно позвонить Application.Restart() методы, которые имеют тенденцию вызывать приложение для перезапуска. Но вы должны выйти из локальной среды со своими кодами ошибок:
вы можете создать перечисление кодов ошибок, которые вы можете использовать его эффективно.
другой метод - просто выйти из приложения и запустить процесс, имеющий исполняемый путь:
Метод Запуска / Выхода
Это, кажется, работает лучше, чем приложение.Restart();
не уверен, как это работает, если ваша программа защищает от нескольких экземпляров. Я думаю, тебе лучше начать со второго .exe, который приостанавливается, а затем запускает ваше основное приложение для вас.
Как лучше перезапустить приложение?
22 ответа
К сожалению, вы не можете использовать Process.Start () для запуска экземпляра текущего процесса. Согласно документации Process.Start (): «Если процесс уже запущен, дополнительные ресурсы процесса не запускаются . »
Этот метод будет отлично работать в отладчике VS (потому что VS выполняет какое-то волшебство, которое заставляет Process.Start думать, что процесс еще не запущен), но потерпит неудачу, если он не запущен в отладчике. (Обратите внимание, что это может зависеть от ОС - я, кажется, помню, что в некоторых моих тестах он работал как на XP, так и на Vista, но, возможно, я просто вспомнил, как запускал его под отладчиком.)
Этот метод как раз использовался последним программистом в проекте, над которым я сейчас работаю, и я пытался найти обходной путь для этого довольно долгое время. Пока что я нашел только одно решение, и оно мне кажется грязным и непонятным: запустить второе приложение, которое в фоновом режиме ждет завершения первого приложения, а затем повторно запускает первое приложение. Я уверен, что это сработает, но, черт возьми.
Изменить: использование второго приложения работает. Все, что я сделал во втором приложении, было:
(Это очень упрощенный пример. В реальном коде много проверок работоспособности, обработки ошибок и т. Д.)
У меня сработал гораздо более простой подход:
Это сохраняет аргументы командной строки и работает, несмотря на обработчики событий, которые обычно предотвращают закрытие приложения.
Вызов Restart () пытается завершить работу, все равно запускает новый экземпляр и возвращается. Затем вызов Exit () завершает процесс, не давая возможности обработчикам событий запуститься. В течение очень короткого периода времени выполняются оба процесса, что не является проблемой в моем случае, но, возможно, в других случаях.
Код выхода 0 в Environment.Exit(0); указывает на полное завершение работы. Вы также можете выйти, нажав 1, чтобы указать, что произошла ошибка.
Если вы находитесь в основной форме приложения, попробуйте использовать
Я могу опоздать на вечеринку, но вот мое простое решение, которое отлично работает с каждым моим приложением:
У меня была точно такая же проблема, и у меня тоже было требование предотвращать дублирование экземпляров - я предлагаю альтернативное решение тому, которое предлагает HiredMind (которое будет работать нормально).
Я запускаю новый процесс с processId старого процесса (того, который запускает перезапуск) в качестве аргумента строки cmd:
Затем, когда новое приложение запускается, я сначала анализирую аргументы строки cm и проверяю, есть ли флаг перезапуска с идентификатором процесса, а затем жду, пока этот процесс завершится:
Я явно не показываю все имеющиеся у меня проверки безопасности и т. Д.
Даже если это не идеально - я считаю это допустимой альтернативой, так что вам не нужно иметь отдельное приложение только для обработки перезапуска.
Метод запуска / выхода
Кажется, это работает лучше, чем Application.Restart ();
Не знаю, как это работает, если ваша программа защищает от нескольких экземпляров. Я предполагаю, что вам лучше запустить второй .exe, который приостанавливает работу, а затем запускает ваше основное приложение за вас.
Это просто, вам просто нужно вызвать метод Application.Restart() , это вызовет перезапуск вашего приложения. Вы также должны выйти из локальной среды с кодом ошибки:
Вы можете создать список кодов ошибок, чтобы ваше приложение быстро завершилось.
Другой способ - просто выйти из приложения и запустить процесс, используя путь к исполняемому файлу:
Попробуйте этот код:
Этот код также должен быть в функции:
Я придумал другое решение, возможно, кто-нибудь тоже сможет его использовать.
Код упрощен, поэтому позаботьтесь об исключениях и прочем;)
Вы забываете параметры / параметры командной строки, которые были переданы вашему запущенному в данный момент экземпляру. Если вы их не пройдете, вы не выполните настоящий перезапуск. Установите Process.StartInfo с клоном параметров вашего процесса, затем выполните запуск.
Например, если ваш процесс был запущен как myexe -f -nosplash myfile.txt , ваш метод будет выполнять только myexe без всех этих флагов и параметров.
Я хотел, чтобы новое приложение запускалось после закрытия старого.
Использование process.WaitForExit () для ожидания завершения работы вашего собственного процесса не имеет смысла. Это всегда будет тайм-аут.
Итак, мой подход состоит в том, чтобы использовать Application.Exit (), а затем ждать, но разрешить обработку событий в течение определенного периода времени. Затем запустите новое приложение с теми же аргументами, что и старое.
Вы также можете использовать Restarter.
Restarter - это приложение, которое автоматически отслеживает и перезапускает вышедшие из строя или зависшие программы и приложения. Первоначально он был разработан для мониторинга и перезапуска игровых серверов, но он будет выполнять свою работу для любой консоли или программы или приложения на основе форм.
Application.ExecutablePath возвращает путь к вашему приложению .exe-файлу Пожалуйста, соблюдайте порядок звонков. Вы можете поместить его в предложение try-catch.
Я опасаюсь, что перезапуск всего приложения с использованием Process неверно решит вашу проблему.
Более простой способ - изменить файл Program.cs для перезапуска:
Как насчет создания файла bat, запустить пакетный файл перед закрытием, а затем закрыть текущий экземпляр.
Пакетный файл делает это:
- подождите в цикле, чтобы проверить, завершился ли процесс.
- начать процесс.
Вот мои 2 цента:
Последовательность Start New Instance-> Close Current Instance должна работать даже для приложений, которые не позволяют запускать несколько копий одновременно, так как в этом случае новому экземпляру может быть передан аргумент командной строки, который будет указывать на то, что выполняется перезапуск. поэтому проверка наличия других запущенных экземпляров не требуется. Ожидание завершения работы первого экземпляра, я тоже буду реализован, если абсолютно необходимо, чтобы никакие два экземпляра не работали параллельно.
Проблема использования Application.Restart () заключается в том, что он запускает новый процесс, но "старый" все еще остается. Поэтому я решил убить старый процесс, используя следующий фрагмент кода:
У меня была аналогичная проблема, но моя была связана с неуправляемой утечкой памяти, которую я не мог найти в приложении, которое должно работать 24/7. С заказчиком я согласился, что безопасное время для перезапуска приложения - 03:00, если потребление памяти превышает заданное значение.
Я попробовал Application.Restart , но, поскольку он, кажется, использует какой-то механизм, запускающий новый экземпляр, когда он уже запущен, я выбрал другую схему. Я использовал уловку, согласно которой файловая система обрабатывает файлы, которые сохраняются до тех пор, пока процесс, создавший их, не умирает. Итак, из приложения я сбросил файл на диск, а не Dispose() дескриптор. Я также использовал этот файл для отправки исполняемого файла «себе» и начального каталога (для большей гибкости).
Close() в конце инициирует завершение работы приложения, а дескриптор файла, который я использовал для StreamWriter здесь, будет оставаться открытым до тех пор, пока процесс действительно не завершится. Затем.
Читайте также:
- Голосовой поиск яндекс как включить на телефоне
- Многооконные приложения в wpf можно осуществить с помощью
- Что такое портативная версия telegram
- Какие задачи защиты информации решают рассмотренные функции приложений офисных пакетов
- Как удалить письма в яндекс почте от одного адресата все сразу на телефоне