Dlaczego aplikacja.Restart () nie jest niezawodny?

Użycie metody Application.Restart() W C# powinno zrestartować bieżącą aplikację: ale wydaje się, że to nie zawsze działa.

Czy Jest jakiś powód tego problemu, czy ktoś może mi powiedzieć, dlaczego nie działa cały czas?

 42
Author: Richard Everett, 2008-09-18

11 answers

Powodów może być wiele. Nie chodzi o to, że ta metoda nie działa; raczej wiele razy Programiści zapominają, że umieścili w swoim kodzie coś, co powstrzymałoby aplikację przed automatycznym zamknięciem lub uruchomieniem. Dwa przykłady:

  • Zdarzenie zamknięcia formularza może zatrzymać zamknięcie aplikacji
  • jeśli sprawdzasz już uruchomiony proces, Stary może nie zamykać się wystarczająco szybko, aby umożliwić rozpoczęcie nowego w górę.

Sprawdź kod dla gotchas jak to. Jeśli widzisz takie zachowanie w pustej aplikacji, najprawdopodobniej będzie to problem z rzeczywistą funkcją niż twój kod.

Sprawdź kod źródłowy Microsoft restart aplikacji.

 27
Author: TheSmurf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-04 15:55:55

W moim przypadku (brak pojedynczej instancji), gdzie

Application.Restart();

Nie zadziałało,

System.Diagnostics.Process.Start(Application.ExecutablePath);
Application.Exit();
Udało się!
 17
Author: cprcrack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-15 09:45:33

Jedyny raz napotkałem tego rodzaju problem, kiedy w mojej głównej formie miałem Niestandardowy FormClosing obsługa zdarzeń, która wykonywała logikę i anulowała Zdarzenie.

EDIT:

Natknąłem się teraz na inną instancję i na podstawie Twoich komentarzy prawdopodobnie odzwierciedla to, czego doświadczałeś.

Uruchamiając pojedynczą instancję aplikacji, używając Mutexu, wołałem Application.Restart() z dość osadzonej lokalizacji, która miała sporo do zrobienia. Wygląda na to, że restart uruchamiał nowa instancja przed ukończeniem poprzedniej instancji, więc Mutex nie uruchamiał nowej instancji.

 6
Author: Timothy Carter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-03 08:19:12

W moim programie Mam mutex, aby zapewnić tylko jedną instancję aplikacji działającej na komputerze. Powodowało to, że nowo uruchomiona aplikacja nie uruchamiała się, ponieważ mutex nie został wydany w odpowiednim czasie. W rezultacie dodałem wartość Properties.Settings, która wskazuje, że aplikacja jest restartowana. Przed wywołaniem Application.Restart() wartość Properties.Settings jest ustawiona na true. W Program.Main() dodałem również sprawdzenie dla tej konkretnej wartości {[6] } tak, że gdy true jest resetowany do false and there is a Thread.Sleep(3000);

W twoim programie możesz mieć logikę:

if (ShouldRestartApp)
{
   Properties.Settings.Default.IsRestarting = true;
   Properties.Settings.Default.Save();
   Application.Restart();
}

W 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();
   }
}
To wszystko.
 5
Author: cmptrs4now,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-02 05:26:57

Spróbuj zablokować przed wyrzuceniem. Oto jak zainicjuję pełny zrzut aplikacji. Może Ci się udać, może nie.

Context.Application.Lock();
Context.Session.Abandon();
Context.Application.RemoveAll();
Context.Application.Restart();
Context.Application.UnLock();
 2
Author: Oli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 18:20:08

Jeśli aplikacja została uruchomiona po raz pierwszy z lokalizacji sieciowej i jest niepodpisana (najpierw zostanie wyświetlone okno dialogowe ostrzeżenia), nie uruchomi się ponownie i tylko zakończy działanie.

 1
Author: Matt Hanson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-22 04:17:43

Wypróbuj ten kod:

bool appNotRestarted = true;

Ten kod musi być również w funkcji:

if (appNotRestarted == true)
{
    appNotRestarted = false;
    Application.Restart();
    Application.ExitThread();
}
 1
Author: ferhatayhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-16 03:12:46
Application.Restart();
Application.ExitThread();                                                     
Dzięki.
 1
Author: shima lagzian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-21 06:55:39

Wiem, że to stary wątek, ale znalazłem obejście. Mam nadzieję, że to pomoże komuś innemu w potrzebie.

Potrzebowałem rozwiązania, które uruchomiłoby sekwencję aktualizacji podczas uruchamiania aplikacji ClickOnce z kodu. Nie zrobiłem tego. Chciałem mieć możliwość sprawdzenia aktualizacji, a następnie wywołania wbudowanego menedżera aktualizacji, aby nie musiał pisać niestandardowego.

    'VB Code Sample
    Dim strStart As String = System.Environment.GetFolderPath(Environment.SpecialFolder.StartMenu) & "\Programs\Folder\YourApplication.appref-ms"
    Application.Exit()
    Try
        Process.Start(strStart)
    Catch ex As Exception
        'Do something with the exception
    End Try

Jedyny problem, który widzę z tym obejściem jest to, że użytkownik może usunąć skrót z menu start. Jeśli jest to problemem, możesz napisać kod, aby skopiować link menu start do wybranego folderu, najlepiej w folderze aplikacji ClickOnce. Jest to ważne, ponieważ ikona menu start dla aplikacji nie jest .lnk lub .exe, to jest rzeczywiście .appref-ms link. Zobacz ClickOnce .appref-ms więcej niż link do .plik wniosku? ten link wyjaśnia to bardziej szczegółowo.

Ten kod będzie działał z ClickOnce SingleInstance Aplikacje.

 0
Author: Nathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:37
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;
            }
        }
    }
 0
Author: Martin.Martinsson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-24 10:24:28

Mam ten sam problem z. Net 4.7 framework. Zaakceptowana odpowiedź była kluczem do mojego sukcesu. Miałem kod w zdarzeniu FormClosing, które zajęło trochę czasu i zatrzymało proces restartu. To co zrobiłem to wrzuciłem taki sentinel:

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

Tylko wtedy aplikacja.Restart () działa!

 0
Author: Nandostyle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-24 18:09:48