如何重新启动WPF应用程序? 在Windows窗体中,我使用了
System.Windows.Forms.Application.Restart();
如何在WPF中执行此操作?
答案 0 :(得分:88)
我发现了这个: 有用。 但。 还有更好的办法吗?
System.Diagnostics.Process.Start(Application.ResourceAssembly.Location);
Application.Current.Shutdown();
答案 1 :(得分:35)
我在WPF中成功使用了这个:
System.Windows.Forms.Application.Restart();
System.Windows.Application.Current.Shutdown();
答案 2 :(得分:9)
Application.Restart();
或
System.Diagnostics.Process.Start(Application.ExecutablePath);
Application.Exit();
在我的程序中,我有一个互斥锁,以确保只在计算机上运行一个应用程序实例。这导致新启动的应用程序无法启动,因为互斥锁未及时释放。因此,我在Properties.Settings中添加了一个值,表明应用程序正在重新启动。在调用Application.Restart()之前,Properties.Settings值设置为true。在Program.Main()中,我还添加了对特定property.settings值的检查,以便在为true时将其重置为false并且存在Thread.Sleep(3000);
在你的程序中,你可能有逻辑:
if (ShouldRestartApp)
{
Properties.Settings.Default.IsRestarting = true;
Properties.Settings.Default.Save();
Application.Restart();
}
在Program.Main()
中[STAThread]
static void Main()
{
Mutex runOnce = null;
if (Properties.Settings.Default.IsRestarting)
{
Properties.Settings.Default.IsRestarting = false;
Properties.Settings.Default.Save();
Thread.Sleep(3000);
}
try
{
runOnce = new Mutex(true, "SOME_MUTEX_NAME");
if (runOnce.WaitOne(TimeSpan.Zero))
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
finally
{
if (null != runOnce)
runOnce.Close();
}
}
就是这样。
答案 3 :(得分:9)
延迟1秒后,通过命令行运行程序的新实例。 在延迟当前实例关闭期间。
ProcessStartInfo Info = new ProcessStartInfo();
Info.Arguments = "/C choice /C Y /N /D Y /T 1 & START \"\" \"" + Assembly.GetEntryAssembly().Location + "\"";
Info.WindowStyle = ProcessWindowStyle.Hidden;
Info.CreateNoWindow = true;
Info.FileName = "cmd.exe";
Process.Start(Info);
Process.GetCurrentProcess().Kill();
修改强>
我修复了代码:
代替:Assembly.GetExecutingAssembly().Location
这:Assembly.GetEntryAssembly().Location
当函数在单独的dll中运行时,这很重要。
和 -
代替:Application.Current.Shutdown();
这:Process.GetCurrentProcess().Kill();
它可以在WinForms和WPF中工作,如果你编写一个专为两者设计的dll,那么它非常重要。
答案 4 :(得分:7)
Application.Current.Shutdown();
System.Windows.Forms.Application.Restart();
按照这个顺序为我工作,反过来只是启动了另一个应用程序实例。
答案 5 :(得分:2)
这些提议的解决方案可能有效,但正如另一位评论者提到的,他们觉得有点像快速黑客。另一种感觉更清洁的方法是运行批处理文件,该批处理文件包括等待当前(关闭)应用程序终止的延迟(例如5秒)。
这可以防止两个应用程序实例同时打开。在我的情况下,两个应用程序实例同时打开无效 - 我使用互斥锁来确保只有一个应用程序打开 - 由于应用程序使用了一些硬件资源。
示例窗口批处理文件(“restart.bat”):
sleep 5
start "" "C:\Dev\MyApplication.exe"
在WPF应用程序中,添加以下代码:
// Launch the restart batch file
Process.Start(@"C:\Dev\restart.bat");
// Close the current application
Application.Current.MainWindow.Close();
答案 6 :(得分:1)
Application.Restart();
Process.GetCurrentProcess().Kill();
对我来说就像一个魅力
答案 7 :(得分:0)
以Hooch为例,我使用了以下内容:
using System.Runtime.CompilerServices;
private void RestartMyApp([CallerMemberName] string callerName = "")
{
Application.Current.Exit += (s, e) =>
{
const string allowedCallingMethod = "ButtonBase_OnClick"; // todo: Set your calling method here
if (callerName == allowedCallingMethod)
{
Process.Start(Application.ResourceAssembly.Location);
}
};
Application.Current.Shutdown(); // Environment.Exit(0); would also suffice
}