为什么Application.Restart()不可靠?

MAD*_*Map 44 .net c#

Application.Restart()在C#中使用该方法应该重新启动当前的应用程序:但似乎这并不总是有效.

这个问题是否有原因,有人可以告诉我,为什么它不能一直工作?

The*_*urf 29

可能有很多原因.这不是方法不起作用; 相反,很多时候程序员忘记了他们在代码中放了一些东西会阻止应用程序自动关闭或启动.两个例子:

  • 表单上的Closing事件可以阻止应用程序关闭
  • 如果您正在检查已经运行的进程,那么旧进程可能无法快速关闭以允许新进程启动.

检查你的代码是否有类似的问题.如果您在空白应用程序中看到此行为,那么实际功能可能比您的代码更容易出现问题.

检查Microsoft的应用程序重启源代码.

  • @MADMap:您的单实例检查是问题所在.你的旧应用程序不会死,然后开始新的应用程序,因为它已经死了它无法做任何事情. (3认同)

cpr*_*ack 18

在我的情况下(没有单一实例),在哪里

Application.Restart();
Run Code Online (Sandbox Code Playgroud)

不起作用,

System.Diagnostics.Process.Start(Application.ExecutablePath);
Application.Exit();
Run Code Online (Sandbox Code Playgroud)

做了这个工作!

  • clickonce部署的应用程序怎么样? (3认同)
  • 在我的例子中,我有一个单实例应用程序,它只是通过替换Application.Exit(); 与Application.Current.Shutdown(); (2认同)

Tim*_*ter 7

我遇到这种问题的唯一一次是在我的主要表单中,我有一个自定义FormClosing事件处理程序,它执行逻辑并取消了事件.

编辑:

我现在遇到另一个实例,根据您的意见,它可能反映了您的体验.

当使用Mutex运行单个实例应用程序时,我Application.Restart()从一个相当嵌入的位置进行调用,该位置需要进行大量清理.所以似乎重启是在前一个实例完成之前启动一个新实例,因此Mutex保持新实例的启动.


小智 6

在我的程序中,我有一个互斥锁,以确保只有一个应用程序实例在计算机上运行.这导致新启动的应用程序无法启动,因为互斥锁未及时释放.结果我输入一个值Properties.Settings表示应用程序正在重新启动.在调用之前,Application.Restart()Properties.Settings值设置为true.在Program.Main()我还添加了特定的检查property.settings值,这样,当真正被重置为,有一个Thread.Sleep(3000);

在你的程序中,你可能有逻辑:

if (ShouldRestartApp)
{
   Properties.Settings.Default.IsRestarting = true;
   Properties.Settings.Default.Save();
   Application.Restart();
}
Run Code Online (Sandbox Code Playgroud)

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();
   }
}
Run Code Online (Sandbox Code Playgroud)

而已.

  • 这太可怕了.首先,你正在睡觉,这将永远不会等待恰当的时间.如果计算机处于忙碌状态并且关机时间超过预期,则可能会失败.否则会浪费时间.此外,您正在使用共享*持久*状态.正确的解决方案是在调用`Application.Restart()`之前释放`runOnce`互斥锁. (4认同)