Перезапуск текущего процесса C # - PullRequest
6 голосов
/ 24 июля 2011

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

Ответы [ 3 ]

5 голосов
/ 24 июля 2011

Я бы запустил новый экземпляр и затем вышел из текущего:

private void Restart()
{
    Process.Start(Application.ExecutablePath);

    //some time to start the new instance.
    Thread.Sleep(2000);

    Environment.Exit(-1);//Force termination of the current process.
}

private static void Main()
{
    //wait because we maybe here becuase of the system is restarted so give it some time to clear the old instance first
    Thread.Sleep(5000);

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(...
}

Редактировать: Однако вам также следует рассмотреть возможность добавления какого-либо мьютекса, чтобы разрешить только один экземплярприложение для запуска во время, например:

private const string OneInstanceMutexName = @"Global\MyUniqueName";

private static void Main()
{
    Thread.Sleep(5000);
    bool firstInstance = false;
    using (System.Threading.Mutex _oneInstanceMutex = new System.Threading.Mutex(true, OneInstanceMutexName, out firstInstance))
    {
        if (firstInstance)
        {
            //....
        }
     }
}
0 голосов
/ 19 апреля 2017

В моем приложении WPF (один экземпляр с мьютексом) я использую Process.Start с ProcessStartInfo, который отправляет команду timed cmd для перезапуска приложения:

ProcessStartInfo Info = new ProcessStartInfo();
Info.Arguments = "/C ping 127.0.0.1 -n 2 && \"" + Application.GetCurrentProcess()+ "\"";
Info.WindowStyle = ProcessWindowStyle.Hidden;
Info.CreateNoWindow = true;
Info.FileName = "cmd.exe";
Process.Start(Info);
ShellView.Close();

Команда отправляетсяОС, пинг приостанавливает выполнение сценария на 2-3 секунды, после чего приложение выходит из ShellView.Close (), затем следующая команда после пинга запускает его снова.

Примечание.кавычки вокруг пути, если в нем есть пробелы, которые cmd не может обработать без кавычек. (Мой код ссылается этот ответ )

0 голосов
/ 24 июля 2011

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

Этот поток обсуждает, почему Application.Restart() может не работать в некоторых случаях.

System.Diagnostics.Process.Start(Application.ResourceAssembly.Location);
// Set any state that is required to close your current process.
Application.Current.Shutdown();

Или

System.Diagnostics.Process.Start(Application.ExecutablePath);
// Set any state that is required to close your current process.
Application.Exit();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...