Mam opublikowaną aplikację w języku C #. Problem polega na tym, że za każdym razem, gdy zamykam główny formularz, klikając czerwony przycisk wyjścia, zamyka on formularz, ale nie zamyka aplikacji. Dowiedziałem się tego, gdy próbowałem wyłączyć komputer, mając nadzieję, że aplikacja, którą stworzyłem, działała płynnie, a następnie zostałem zbombardowany przez wiele okien potomnych, za pomocą których zainstalowałem MessageBox
Alerty.
Próbowałem, Application.Exit
ale nadal wywołuje wszystkie okna potomne i alerty i nie wiem, jak używać Environment.Exit
i jaką liczbę całkowitą w nim umieścić.
Nawiasem mówiąc, za każdym razem, gdy moje formularze wywołują formclosed
lub form closing
zdarzenie, zamykam aplikację za pomocą this.Hide()
funkcji; Czy to wpływa na zachowanie mojej aplikacji?
Odpowiedzi:
Z MSDN:
Application.Exit
Environment.Exit
Ten artykuł, Application.Exit vs. Environment.Exit , wskazuje na dobrą wskazówkę:
Możesz sprawdzić, czy
System.Windows.Forms.Application.Run
został wywołany, sprawdzającSystem.Windows.Forms.Application.MessageLoop
właściwość. Jeśli true, to wywołano Run i można założyć, że aplikacja WinForm działa w następujący sposób.Odniesienie: Dlaczego Application.Exit nie działa?
źródło
Application.Exit()
nie udało się zamknąć aplikacji, jednakEnvironment.Exit(1)
działało to jak urok.Environment.Exit(0)
Każda niezerowa wartość ma być specyficznym dla aplikacji kodem błędu, który może być użyty przez skrypt do podjęcia odpowiednich działań. (Jest to nowy kod i aplikacja WinForms, więc w tym przypadku raczej nie ma to znaczenia, ale warto wiedzieć, że ktoś pisze narzędzia wiersza polecenia.)Environment.Exit
może być również używany do składania formularzy.return
później oświadczenie bardzo poprawiłoby to podejście. Jak rozumieć kod będzie kontynuować realizację poApplication.Exit()
aż wreturn
oświadczeniu.Wiem, że nie był to twój problem, jednak może to mieć inny powód, ponieważ w aplikacji jest otwarty wątek inny niż tło.
Kiedy
IsBackground
tofalse
będzie utrzymywać swój program otwarty aż zakończy wątku, jeśli ustawiszIsBackground
dotrue
wątku nie będzie prowadzić program otwarty. Rzeczy takie jakBackgroundWoker
,ThreadPool
iTask
wszystkie wewnętrznie używają wątku zIsBackground
ustawionym natrue
.źródło
Wszystko czego potrzebujesz to
System.Environment.Exit(1);
I używa systemowej przestrzeni nazw „using System”, która jest prawie zawsze dostępna podczas uruchamiania projektu.
źródło
Chciałbym jedno z poniższych:
dla winform lub
dla aplikacji konsolowej (działa również na WinForm).
Dzięki!
źródło
W skrócie tak. Cała aplikacja zakończy się, gdy główny formularz (formularz uruchomiony za
Application.Run
pomocąMain
metody) zostanie zamknięty (nie ukryty).Jeśli cała aplikacja powinna być zawsze w pełni zakończona, gdy tylko główny formularz zostanie zamknięty, należy po prostu usunąć ten zamknięty moduł obsługi. Nie anulując tego wydarzenia i pozwalając mu się zamknąć, gdy użytkownik je zamknie, uzyskasz pożądane zachowanie. Podobnie jak w przypadku wszystkich innych formularzy, jeśli nie zamierzasz ponownie wyświetlać tego samego wystąpienia formularza, po prostu pozwól im się zamknąć, zamiast zapobiegać ich zamknięciu i ukryciu. Jeśli wyświetlasz je ponownie, ukrywanie ich może być w porządku.
Jeśli chcesz, aby użytkownik kliknął „x” dla głównego formularza, ale inny formularz pozostanie otwarty i, w efekcie, stanie się „nową” główną formą, jest to nieco bardziej skomplikowane. W takim przypadku musisz po prostu ukryć główny formularz zamiast go zamykać, ale musisz dodać jakiś mechanizm, który faktycznie zamknie główny formularz, gdy naprawdę chcesz, aby Twoja aplikacja się zakończyła. W takiej sytuacji musisz dodać więcej szczegółów do pytania opisującego, jakie typy aplikacji powinny i nie powinny faktycznie kończyć program.
źródło
Czy ty robisz:
w swoim Main ()?
Uznałem, że jest to bardzo łatwy sposób na zabicie aplikacji, gdy formularz jest zamknięty.
źródło
źródło
W takim przypadku najbardziej właściwym sposobem na zamknięcie aplikacji w celu zastąpienia metody onExit () w App.xaml.cs:
źródło