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?
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.
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ę!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.
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.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();
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.
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();
}
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.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.
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;
}
}
}
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!
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