Как запланировать процесс .start в WPF
-
27-09-2019 - |
Вопрос
Я пытаюсь перезапустить приложение в WPF.
Я попробовал следующее:
Process.Start(Application.ExecutablePath);
Process.GetCurrentProcess().Kill();
И это не работает, потому что приложение установлено в качестве приложения одного экземпляра.
Тогда я устал это:
Process.GetCurrentProcess().Kill();
Process.Start(Application.ExecutablePath);
И это не работает, потому что, как только мы убьем процесс, он не будет достигнут линию 2
Есть ли способ запланировать .start, чтобы я не бел в проблему № 1.
Решение
Вы можете запустить вторичное приложение, которое затем повторно запустит вашу основную программу после задержки. Когда я написал самоуверению несколько лет назад, это был путь реализации, который я взял. Это была просто простая программа, которая взяла исполняемый файл в качестве командной строки ARG, будет спать на десятую секунду, затем.
Лучший путь внедрения, чем я взял, будет иметь вновь запущенную программу ждать процесса, который запустил его для завершения. Ожидание произвольного периода времени может усложнить вопросы. Чтобы выполнить это, я бы, вероятно, пройдет идентификатор процесса в реконструкцию, чтобы он точно знал, какой процесс ждать.
Другие советы
Это не так сильно, как вы думаете. Все, что вам нужно сделать, это вызвать следующий метод, проходя в командной строке для перезапущенного экземпляра:
public static void RestartMe(string commandLine)
{
var myId = Process.GetCurrentProcess().Id;
var myPath = Assembly.GetEntryAssembly().CodeBase.Replace("file:///", "");
var systemPath = typeof(object).Assembly.CodeBase.Replace("file:///", "");
var tempPath = Path.GetTempFileName();
File.WriteAllText(tempPath + ".cs", @"
using System;
using System.Diagnostics;
public class App
{
public static void Main(string[] args)
{
try { Process.GetProcessById(" + myId + @").WaitForExit(); } catch {}
Process.Start(""" + myPath + @""", Environment.CommandLine);
}
}");
var compiler = new ProcessStartInfo
{
FileName = Path.Combine(Path.GetDirectoryName(systemPath), "csc.exe"),
Arguments = tempPath + ".cs",
WorkingDirectory = Path.GetDirectoryName(tempPath),
WindowStyle = ProcessWindowStyle.Hidden,
};
var restarter = new ProcessStartInfo
{
FileName = tempPath + ".exe",
Arguments = commandLine,
WindowStyle = ProcessWindowStyle.Hidden,
};
Process.Start(compiler).WaitForExit();
Process.Start(restarter); // No WaitForExit: restarter WaitForExits us instead
File.Delete(tempPath);
File.Delete(tempPath + ".cs");
Environment.Exit(0);
}
Как это работает: это на самом деле создает еще одну программу «Restarter», но это безболезненно и автоматически. Программа Restarter имеет текущий идентификатор процесса и исполняемое имя файла, встроенное в него. Он всегда найдет компилятор, потому что Net Framework версия отправляется с совместимым CSC.exe в той же папке, что и System.dll.