2011-12-14 18 views
16

Mam aplikację, która importuje dane z programu Excel. Jednak po uruchomieniu aplikacji WinForm i uruchomieniu aplikacji, używając System.Windows.Forms.Application.Exit();, nadal widzę w menedżerze zadań ".Ashsh32.exe".Wychodzenie z aplikacji WinForm C#

Po wyjściu z aplikacji w trybie debugowania formularz zostaje zamknięty, ale IDS VS nie jest "zatrzymany".

Jak zapewnić prawidłowe zakończenie aplikacji.

+0

Podobne pytanie do http://stackoverflow.com/questions/4314436/i-cant-kill-myapp-vshost-exe – dash

Odpowiedz

21

Twoje połączenie z Application.Exit() działa poprawnie. Plik wykonywalny MyAppName.vshost32.exe jest hostem do celów debugowania. Działa, gdy projekt jest otwarty w Visual Studio, niezależnie od tego, czy jest aktywna sesja debugowania.

Aktualizacja: OK, źle mnie zrozumiałem. Powyższe jest prawdziwe, ale prawdopodobnie masz problemy z zawieszonymi wątkami w tle. Musisz zakończyć wątki, aby zamknąć je poprawnie. Odpowiedź Ashera na to obejmuje. Jeśli jesteś po prostu staramy się robić super-hacky szybki i brzydka zabić, można użyć następujących (choć biorę żadnej odpowiedzialności za skutki uboczne, ponieważ jest to bardzo hacky):

System.Diagnostics.Process.GetCurrentProcess().Kill();

+1

Wyrażam zgodę na ogół , z tym wyjątkiem, że w tym konkretnym scenariuszu sesja debugowania VS nadal trwa, wskazując, że aplikacja jest nadal uruchomiona (przynajmniej tak interpretowałem pytanie) – Cameron

+0

@Cameron - Ah, źle zrozumiałem. Zaktualizuję. – Polynomial

+0

Nice catch @Cameron – Troy

6

Have próbowałeś bardziej brutalnej funkcji Environment.Exit()?

Application.Exit() po prostu wysyła komunikat informujący o wyłączeniu; jeśli wiadomość nigdy nie zostanie przetworzona (z jakiegokolwiek powodu), aplikacja pozostanie uruchomiona na czas nieokreślony.

Z MSDN documentation of Application.Exit():

Sposób Zakończ Zatrzymuje wszystkie uruchomione wiadomość pętle na wszystkie gwinty i zamyka wszystkie okna aplikacji. Ta metoda nie musi wymuszać zamknięcia aplikacji. Metoda Exit jest zwykle wywoływana z pętli komunikatów i wymusza działanie Run, aby powrócić.

+0

Cóż, formularz kończy się, a kiedy robię punkt przerwania, trafiam tę linię, i to działa dobrze. Więc ta linia zostanie wykonana. – Troy

+0

@ Troy: Tak, ale wywołanie 'Application.Exit()' powoduje wysłanie wiadomości do kolejki wszystkich pomp komunikatów; Wydaje się, że pompa twojej formy przetwarza komunikat i wychodzi, ale jest coś jeszcze (inny wątek, może?), który nie odpowiada na prośbę – Cameron

4

Miałem podobny problem spowodowany przez narzędzie innej firmy, które nie pozwoliło mi ustawić wątków jako tła. Wielomian miał dobry pomysł, ale składnia jest tak:

System.Diagnostics.Process.GetCurrentProcess().Kill(); 
Powiązane problemy