Почему Application.Restart () не является надежным? - PullRequest
42 голосов
/ 18 сентября 2008

Использование метода Application.Restart() в C # должно перезапустить текущее приложение: но кажется, что это не всегда работает.

Есть ли причина этой проблемы, может кто-нибудь сказать мне, почему она не работает все время?

Ответы [ 11 ]

27 голосов
/ 18 сентября 2008

Для этого может быть много причин. Дело не в том, что метод не работает; Скорее, много раз программисты забывают, что они вставили в свой код что-то, что не давало бы приложению автоматически закрываться или запускаться. Два примера:

  • Событие закрытия в форме может остановить завершение работы приложения
  • Если вы проверяете уже запущенный процесс, старый может закрываться недостаточно быстро, чтобы запустить новый.

Проверьте ваш код на наличие подобных ошибок. Если вы видите такое поведение в пустом приложении, то это скорее проблема с реальной функцией, чем с вашим кодом.

Проверьте исходный код Microsoft для перезапуска приложения .

18 голосов
/ 24 октября 2010

В моем случае (НЕТ одного экземпляра), где

Application.Restart();

не работает,

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

сделал работу!

7 голосов
/ 18 сентября 2008

Единственный раз, когда я сталкиваюсь с такой проблемой, это когда в основной форме у меня был пользовательский обработчик события FormClosing, который выполнял логику и отменял событие.

EDIT:

Я столкнулся с другим случаем, и, основываясь на ваших комментариях, он, возможно, отражает то, что вы испытывали.

Когда я запускал одноэкземплярное приложение, используя Mutex, я звонил Application.Restart() из довольно встроенного местоположения, которое требовало много времени для очистки. Таким образом, кажется, что перезапуск запускал новый экземпляр до того, как предыдущий был завершен, поэтому Mutex препятствовал запуску нового экземпляра.

5 голосов
/ 30 января 2012

В моей программе есть мьютекс, чтобы обеспечить только один экземпляр приложения, работающего на компьютере. Это приводило к тому, что вновь запущенное приложение не запускалось, потому что мьютекс не был выпущен своевременно. В результате я поместил значение в 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();
   }
}

Вот и все.

2 голосов
/ 18 сентября 2008

Попробуйте заблокировать перед сбросом. Вот как я запускаю полный дамп приложения. Может сработать для вас, не может.

Context.Application.Lock();
Context.Session.Abandon();
Context.Application.RemoveAll();
Context.Application.Restart();
Context.Application.UnLock();
1 голос
/ 21 мая 2014
Application.Restart();
Application.ExitThread();                                                     

это сработало для меня, спасибо.

1 голос
/ 27 июля 2011

Попробуйте этот код:

bool appNotRestarted = true;

Этот код также должен быть в функции:

if (appNotRestarted == true)
{
    appNotRestarted = false;
    Application.Restart();
    Application.ExitThread();
}
1 голос
/ 22 июля 2010

Если приложение было впервые запущено из сетевого расположения и не подписано (сначала вы получаете диалоговое окно с предупреждением), оно не будет перезапущено и будет только завершено.

0 голосов
/ 24 мая 2018

У меня такая же проблема с .Net 4.7 framework. Принятый ответ был ключом к моему успеху. У меня был код в событии FormClosing, который занимал некоторое время и останавливал процесс перезапуска. Что я сделал, так это поставил часового:

If JustCloseIT = False Then
   'all closing code, like logging the session log-out to a database and all those goodies we all do.
 End If

только тогда Application.Restart () сработало!

0 голосов
/ 24 февраля 2017
public static void ApplicationRestart(params string[] commandLine)
    {
        lock (SynchObj)
        {
            if (Assembly.GetEntryAssembly() == null)
            {
                throw new NotSupportedException("RestartNotSupported");
            }

            if (_exiting)
                return;

            _exiting = true;

            if (Environment.OSVersion.Version.Major < 6) return;

            bool cancelExit = true;

            try
            {
                foreach (Form f in Application.OpenForms.OfType<Form>().ToList())
                {
                    f.InvokeIfRequired(frm =>
                    {
                        frm.FormClosing += (sender, args) => cancelExit = args.Cancel;
                        frm.Close();
                    });

                    if (cancelExit) break;
                }

                if (cancelExit) return;

                Process.Start(new ProcessStartInfo
                {
                    UseShellExecute = true,
                    WorkingDirectory = Environment.CurrentDirectory,
                    FileName = Application.ExecutablePath,
                    Arguments = commandLine.Length > 0 ? string.Join(" ", commandLine) : string.Empty
                });

                Application.Exit();
            }
            finally
            {
                _exiting = false;
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...