当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么Application.Restart()不可靠?》经验,为你挑选了4个好方法。

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

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



1> TheSmurf..:

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

表单上的Closing事件可以阻止应用程序关闭

如果您正在检查已经运行的进程,那么旧进程可能无法快速关闭以允许新进程启动.

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

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


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

2> cprcrack..:

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

Application.Restart();

不起作用,

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

做了这个工作!


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

3> Timothy Cart..:

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

编辑:

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

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



4> 小智..:

在我的程序中,我有一个互斥锁,以确保只有一个应用程序实例在计算机上运行.这导致新启动的应用程序无法启动,因为互斥锁未及时释放.结果我输入一个值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();
}

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();
   }
}

而已.


这太可怕了.首先,你正在睡觉,这将永远不会等待恰当的时间.如果计算机处于忙碌状态并且关机时间超过预期,则可能会失败.否则会浪费时间.此外,您正在使用共享*持久*状态.正确的解决方案是在调用`Application.Restart()`之前释放`runOnce`互斥锁.
推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有