C команда перезапуска программы

Разработка приложения WinForm С#.NET 2.0. Необходимо, чтобы приложение закрывалось и перезапускалось.

Application.Restart();

Каков лучший способ перезапустить приложение?

ОТВЕТЫ

Ответ 1

К сожалению, вы не можете использовать Process.Start() для запуска экземпляра текущего процесса. В соответствии с документами Process.Start(): «Если процесс уже запущен, никакой ресурс процесса не запускается. «

Этот метод будет работать отлично под отладчиком VS (потому что VS делает какую-то магию, которая заставляет Process.Start думать, что процесс еще не запущен), но не будет работать, если не будет запущен под отладчиком. (Обратите внимание, что это может быть специфично для ОС — я, кажется, помню, что в некоторых моих тестах он работал либо с XP, либо с Vista, но я могу просто помнить, как его запускать под отладчиком.)

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

Как перезапустить сенсор Freestyle Libre на новый срок // Freestyle libre restart for a new term

Изменить: работает 2-я прикладная программа. Все, что я сделал во втором приложении:

static void RestartApp(int pid, string applicationName ) < // Wait for the process to terminate Process process = null; try < process = Process.GetProcessById(pid); process.WaitForExit(1000); >catch (ArgumentException ex) < // ArgumentException to indicate that the // process doesn’t exist? LAME!! >Process.Start(applicationName, «»); >

(Это очень упрощенный пример. Реальный код имеет множество проверок работоспособности, обработки ошибок и т.д.)

Ответ 2

Если вы находитесь в основной форме приложения, попробуйте использовать

System.Diagnostics.Process.Start( Application.ExecutablePath); // to start new instance of application this.Close(); //to turn off current app

Ответ 3

Более простой подход, который работал у меня, это:

Application.Restart(); Environment.Exit(0);

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

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

Код завершения 0 в Environment.Exit(0); указывает на чистое завершение работы. Вы также можете выйти с 1 для указания произошедшей ошибки.

Ответ 4

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

Быстрые советы для ПК | Как перезапустить графические драйверы


try < //run the program again and close this one Process.Start(Application.StartupPath + «\blabla.exe»); //or you can use Application.ExecutablePath //close this one Process.GetCurrentProcess().Kill(); >catch

Ответ 5

У меня была такая же точная проблема, и у меня также было требование предотвратить дублирование экземпляров — я предлагаю альтернативное решение для того, что предлагает HiredMind (что будет работать нормально).

То, что я делаю, — это запуск нового процесса с помощью processId старого процесса (тот, который запускает перезапуск) в качестве аргумента строки cmd:

// Shut down the current app instance. Application.Exit(); // Restart the app passing «/restart [processId]» as cmd line args Process.Start(Application.ExecutablePath, «/restart» + Process.GetCurrentProcess().Id);

Затем, когда запускается новое приложение, я сначала разбираю аргументы cm line и проверяю, есть ли флаг перезапуска с processId, а затем дождаться завершения этого процесса:

if (_isRestart) < try < // get old process and wait UP TO 5 secs then give up! Process oldProcess = Process.GetProcessById(_restartProcessId); oldProcess.WaitForExit(5000); >catch (Exception ex) < // the process did not exist — probably already closed! //TODO: —>LOG > >

Я, очевидно, не показываю все проверки безопасности, которые у меня есть, и т.д.

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

Читайте также:
Отличие задачи от программы

Ответ 6

Простой вам просто нужно вызвать методы Application.Restart() , которые имеют тенденцию вызывать ваше приложение для перезапуска. Но вам придется выйти из локальной среды с кодами ошибок:

Application.Restart(); Environment.exit(int errorcode);

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

Application.exit(); System.Diagnostics.Process.Start(Application.ExecutablePath);

Ответ 7

Метод запуска/выхода

// Get the parameters/arguments passed to program if any string arguments = string.Empty; string[] args = Environment.GetCommandLineArgs(); for (int i = 1; i < args.Length; i++) // args[0] is always exe path/filename arguments += args[i] + » «; // Restart current application, with same arguments/parameters Application.Exit(); System.Diagnostics.Process.Start(Application.ExecutablePath, arguments);

Это работает лучше, чем Application.Restart();

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

Ответ 8

Попробуйте этот код:

bool appNotRestarted = true;

Этот код также должен быть в функции:

if (appNotRestarted == true)

Ответ 9

Я понял другое решение, возможно, кто-то может его использовать.

Кодекс упрощен, поэтому позаботьтесь об исключениях и прочее;)

Ответ 10

Вы забываете параметры/параметры командной строки, которые были переданы вашему текущему запущенному экземпляру. Если вы не проходите мимо, вы не выполняете реальный перезапуск. Задайте параметры Process.StartInfo с параметрами клона вашего процесса, затем запустите.

Например, если ваш процесс был запущен как myexe -f -nosplash myfile.txt , ваш метод выполнил бы только myexe без всех этих флагов и параметров.

Ответ 11

Вы также можете использовать Restarter.

Restarter — это приложение, которое автоматически контролирует и перезапускает разбитые или зависающие программы и приложения. Он был первоначально разработан для мониторинга и перезапуска игровых серверов, но он будет выполнять задание для любой программы или приложения на основе консоли или формы.

Ответ 12

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

Использование process.WaitForExit() для ожидания выключения вашего собственного процесса не имеет смысла. Он всегда будет тайм-аут.

Итак, мой подход заключается в использовании Application.Exit(), затем подождите, но разрешите обработку событий в течение определенного периода времени. Затем запустите новое приложение с теми же аргументами, что и старые.

static void restartApp() < string commandLineArgs = getCommandLineArgs(); string exePath = Application.ExecutablePath; try < Application.Exit(); wait_allowingEvents( 1000 ); >catch( ArgumentException ex ) < throw; >Process.Start( exePath, commandLineArgs ); > static string getCommandLineArgs() < Queueargs = new Queue( Environment.GetCommandLineArgs() ); args.Dequeue(); // args[0] is always exe path/filename return string.Join( » «, args.ToArray() ); > static void wait_allowingEvents( int durationMS ) < DateTime start = DateTime.Now; do < Application.DoEvents(); >while( start.Subtract( DateTime.Now ).TotalMilliseconds > durationMS ); >

Ответ 13

public static void appReloader() < //Start a new instance of the current program Process.Start(Application.ExecutablePath); //close the current application process Process.GetCurrentProcess().Kill(); >

Application.ExecutablePath возвращает ваш путь к файлу aplication.exe Пожалуйста, следуйте порядку звонков. Возможно, вы захотите разместить его в предложении try-catch.

Ответ 14

Здесь мои 2 цента:

Последовательность Start New Instance- > Close Current Instance должна работать даже для приложений, которые не позволяют запускать несколько копий одновременно, так как в этом случае новому экземпляру может быть передан аргумент командной строки, который указывает, что существует перезагрузка выполняется, поэтому проверка других запущенных экземпляров не требуется. Ожидание того, что первый экземпляр действительно завершит мою реализацию, тоже необходимо, если абсолютно необходимо, чтобы не было двух параллельных операций.

Ответ 15

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

Более простой способ — изменить файл Program.cs для перезапуска:

static bool restart = true; // A variable that is accessible from program static int restartCount = 0; // Count the number of restarts static int maxRestarts = 3; // Maximum restarts before quitting the program /// /// The main entry point for the application. /// [STAThread] static void Main() < Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); while (restart restartCount < maxRestarts) < restart = false; // if you like.. the program can set it to true again restartCount++; // mark another restart, // if you want to limit the number of restarts // this is useful if your program is crashing on // startup and cannot close normally as it will avoid // a potential infinite loop try < Application.Run(new YourMainForm()); >catch < // Application has crashed restart = true; >> >

Читайте также:
Программа для узнавания характеристики компьютера

Ответ 16

У меня была аналогичная проблема, но моя была связана с неуправляемой утечкой памяти, которую я не мог найти в приложении, которое должно работать 24/7. С клиентом я согласился с тем, что безопасное время для перезапуска приложения было 03:00, если потребление памяти превысило определенное значение.

Я попробовал Application.Restart , но, поскольку он, похоже, использует какой-то механизм, который запускает новый экземпляр, пока он уже запущен, я пошел на другую схему. Я использовал трюк, который обрабатывает файловая система, до тех пор, пока не завершится процесс их создания. Таким образом, из приложения я удалил файл на диск и не выполнил Dispose() дескриптор. Я использовал файл для отправки «сам» исполняемого файла и стартового каталога (чтобы добавить гибкость).

_restartInProgress = true; string dropFilename = Path.Combine(Application.StartupPath, «restart.dat»); StreamWriter sw = new StreamWriter(new FileStream(dropFilename, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite)); sw.WriteLine(Application.ExecutablePath); sw.WriteLine(Application.StartupPath); sw.Flush(); Process.Start(new ProcessStartInfo < FileName = Path.Combine(Application.StartupPath, «VideoPhill.Restarter.exe»), WorkingDirectory = Application.StartupPath, Arguments = string.Format(«»»», dropFilename) >); Close();

Close() в конце будет инициировать завершение работы приложения, а дескриптор файла, который я использовал для StreamWriter , здесь будет оставаться открытым до тех пор, пока процесс не начнет умирать. Тогда.

Restarter.exe вступает в действие. Он TRIES читает файл в эксклюзивном режиме, не позволяя ему получить доступ до тех пор, пока основное приложение не будет мертвым, затем запустит основное приложение, удалит файл и будет существовать. Я предполагаю, что это не может быть проще:

static void Main(string[] args) < string filename = args[0]; DateTime start = DateTime.Now; bool done = false; while ((DateTime.Now — start).TotalSeconds < 30 !done) < try < StreamReader sr = new StreamReader(new FileStream(filename, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)); string[] runData = new string[2]; runData[0] = sr.ReadLine(); runData[1] = sr.ReadLine(); Thread.Sleep(1000); Process.Start(new ProcessStartInfo < FileName = runData[0], WorkingDirectory = runData[1] >); sr.Dispose(); File.Delete(filename); done = true; > catch (Exception ex) < Console.WriteLine(ex.Message); >Thread.Sleep(1000); > >

Ответ 17

Как создать файл bat, запустить пакетный файл перед закрытием, а затем закрыть текущий экземпляр.

Пакетный файл делает это:

  • Подождите в цикле, чтобы проверить, вышел ли процесс.
  • запустите процесс.

Ответ 18

Я использую следующее, и он делает именно то, что вы ищете:

ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment; UpdateCheckInfo info = null; info = ad.CheckForDetailedUpdate(); if (info.IsUpdateRequired) < ad.UpdateAsync(); // I like the update dialog MessageBox.Show(«Application was upgraded and will now restart.»); Environment.Exit(0); >

Ответ 19

для использования в качестве выхода из системы вы должны прекратить все приложения из Ram Cache так что сначала закройте приложение, а затем повторите его.

//при нажатии кнопки выхода

foreach(Form frm in Application.OpenForms.Cast().ToList()) < frm.Close(); >System.Diagnostics.Process.Start(Application.ExecutablePath);

Ответ 20

Проблема использования Application.Restart() заключается в том, что он запускает новый процесс, но «старый» все еще остается. Поэтому я решил убить старый процесс, используя следующий фрагмент кода:

if(Condition)

И это работает хорошо. В моем случае MATLAB и приложение С# используют одну и ту же базу данных SQLite. Если MATLAB использует базу данных, Form-App должен снова перезапустить (+ обратный отсчет), пока MATLAB reset не будет занят бит в базе данных. (Только для дополнительной информации)

Ответ 21

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

Источник: utyatnishna.ru

Application. Restart Метод

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Завершает работу приложения и немедленно запускает новый экземпляр.

public: static void Restart();
public static void Restart ();
static member Restart : unit -> unit
Public Shared Sub Restart ()

Исключения

Код пользователя не является приложением Windows Forms.

Пользователь не может вызвать этот метод в данном контексте.

Комментарии

Наиболее распространенной причиной вызова Restart является запуск новой версии приложения, скачаемого через ClickOnce с помощью Update метода или UpdateAsync метода.

Приложения перезапускаются в контексте, в котором они запускались изначально. Если приложение было запущено с использованием URL-адреса, указывающего непосредственно на основной исполняемый файл приложения, он будет перезапущен с помощью того же URL-адреса. Если приложение является ClickOnce приложением, оно будет перезапущено с помощью ClickOnce.

Если при первом выполнении приложение изначально было предоставлено параметров командной строки, Restart приложение снова запустится с теми же параметрами.

Читайте также:
Лучшая программа для замера разгона до 100 км ч

Источник: learn.microsoft.com

Как перезапустить консольное приложение?

Мне нужно перезапустить консоль приложения, когда пользователь нажимает «R».

у меня есть это

Console.WriteLine(message, «Rebuild Log Files» + » Press Enter to finish, or R to restar the program. «); string restar = Console.ReadLine(); if(restar.ToUpper() == «R») < //here the code to restart the console. >
user708095 18 апр ’11 в 17:22 2011-04-18 17:22
2011-04-18 17:22

10 ответов

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

user313199 18 апр ’11 в 17:37 2011-04-18 17:37
2011-04-18 17:37

// Starts a new instance of the program itself System.Diagnostics.Process.Start(Application.ExecutablePath); // Closes the current process Environment.Exit(0);
user431735 18 апр ’11 в 17:28 2011-04-18 17:28
2011-04-18 17:28
static void Main(string[] args) < var info = Console.ReadKey(); if (info.Key == ConsoleKey.R) < var fileName = Assembly.GetExecutingAssembly().Location; System.Diagnostics.Process.Start(fileName); >>
user2608 25 ноя ’11 в 15:34 2011-11-25 15:34
2011-11-25 15:34

Еще один простой способ

//Start process, friendly name is something like MyApp.exe (from current bin directory) System.Diagnostics.Process.Start(System.AppDomain.CurrentDomain.FriendlyName); //Close the current process Environment.Exit(0);
user8806386 07 июн ’18 в 09:39 2018-06-07 09:39
2018-06-07 09:39

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

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

Так что если Main Метод выглядел так:

static void Main(string[] args) < /* Main Method Variable declarations; Main Method Method calls; Whatever else in the Main Method; */ int SomeNumber = 0; string SomeString = default(string); SomeMethodCall(); //etc. >

Тогда просто создайте Run() метод и положить все из Main в это, вот так:

public static void Run() < //Everything that was in the Main method previously /* Main Method Variable declarations; Main Method Method calls; Whatever else in the Main Method; */ int SomeNumber = 0; string SomeString = default(string); SomeMethodCall(); //etc. >

Теперь, когда Run() Метод создан, и в нем есть все то, что было в Main метод до, просто сделайте ваш основной метод так:

static void Main(string[] args)

Теперь, где бы в коде вы не хотели «перезапускать» программу, просто вызовите Run() метод вроде так:

if(/*whatever condition is met*/) < //do something first //then «re-start» the program by calling Run(); Run(); >

Итак, это упрощенный взгляд на программу:

РЕДАКТИРОВАТЬ: Когда я опубликовал это первоначально, я не принял во внимание любые аргументы, которые могли быть переданы в программу. Чтобы учесть это, нужно изменить четыре вещи в моем первоначальном ответе.

  1. объявить глобальным List как это: public static List MainMethodArgs = new List(); ,
  2. в Main Метод установить значение MainMethodArgs список, равный значениям, переданным в Main метод через args как это: MainMethodArgs = args.ToList();
  3. При создании Run() метод изменить подпись так, чтобы он ожидал string[] называется args быть переданным ему так: public static void Run(string[] args)
  4. Везде, где в программе Run() метод вызывается MainMethodArgs в Run() как это: Run(MainMethodArgs.ToArray());

Я изменил пример ниже, чтобы отразить эти изменения.

using System; using System.Data; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ExampleConsole < class Program < public static ListMainMethodArgs = new List(); static void Main(string[] args) < MainMethodArgs = args.ToList(); Run(MainMethodArgs.ToArray()); >public static void Run(string[] args) < Console.WriteLine(«Run() is starting»); Console.ReadLine(); //stuff that used to be in the public method int MainMethodSomeNumber = 0; string MainMethodSomeString = default(string); SomeMethod(); //etc. >public static void SomeMethod() < Console.WriteLine(«Rebuild Log Files» + » Press Enter to finish, or R to restar the program. «); string restar = Console.ReadLine(); if (restar.ToUpper() == «R») < //here the code to restart the console. Run(MainMethodArgs.ToArray()); >> > >

По сути, программа «перезапускается» без необходимости перезапуска исполняемого файла и закрытия существующего экземпляра программы. Мне кажется, это больше похоже на программиста.

Источник: stackru.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru