nie usuwa programu z listy procesów

0

otóż mam taki już dość rozbudowany program w c# (visual studio 2012 windows forms application), jedyny problem to taki, że jak klikam na zamknij (krzyżyk) czy dodam nowy guzik, pod którym jest "this.Close();" albo "Application.Exit();" to i tak program nie znika z listy procesów, jedyny sposób to ręcznie kliknąć zakończ zadanie, albo kliknąć na "Stop debugging" w visual studio, ale użytkownik programu nie ma przecież dostępu do tego przycisku

problem jest spory bo jak program posiedzi w tych procesach tak z 30minut to nagle zaczyna mocne zżerać procesor

wie ktoś jak to rozwiązać? dodam, że jak robię nowy programik, który w istocie nic nie robi to tam tego problemu nie ma

0
zelus132 napisał(a):

(..) program nie znika z listy procesów, jedyny sposób to ręcznie kliknąć zakończ zadanie, albo kliknąć na "Stop debugging" w visual studio, a

No jeśli musisz kliknąć na Stop debug to właśnie musisz swój program zdebagować... przecież on wciąż działa :)

0

ale jeśli wyśle komuś plik .exe, ten ktoś włączy program, poużywa, coś porobi a potem chce zamknąć, klika w krzyżyk a program nie znika z listy procesów, jak to zmienić?

0

Błąd jest oczywiście w twoim kodzie.
Ale nikt ci nie pomoże na ślepo.

1

Krzyżykiem pewnie zamykasz formę, a może masz uruchomiony jakiś wątek, który coś robi i nie jest wątkiem tła (nie zamyka się z głównym wątkiem), stąd proces dalej jest widoczny w managerze.
A jak dodatkowo po pół godziny twój proces zaczyna zarzynać procesor to masz pewnie kolejny błąd w tym wątku.

Przeleć aplikację profilerem, powinieneś obczaić miejsce, które się sypie.

1

dokładnie, na 99% przypadków winowajcą jest niezakończony wątek

0

tak, mam wątek poboczny, dlatego dodałem dodatkowy przycisk, który najpierw wyłącza wątek poboczny (thread1.Abort()) a potem wyłącza całą aplikację, czyli Application.Exit()

słyszałem, że ten abort to troche słabe rozwiązanie, tzn niedopracowane, może w tym tkwi problem?

edit: no i rzeczywiście, jak wgl nie włączałem wątku pobocznego to zamykanie programu działa jak należy, więc teraz pytanie jak zamykać wątek żeby działało to jak należy, czyli żeby całkowicie go wyłączało

0

Abort nie zabija wątku, tylko rzuca wyjątek ThreadAbortException, więc jeśli twój wątek poboczny ma dużego try..catch'a to może być łapany też ten wyjątek.

0

tak wiem, że abort rzuca tylko wyjątkiem, ale nie mam żadnego try - catch, więc niby ten abort powinien działać, ale jednak nie działa

edit: wymyśliłem obejście tego problemu,

mój wątek nazywa się thread1

 
thread1.Abort();
ThreadStart pts1= delegate { };

thread1 = new Thread(pts1);
thread1.Start();

Application.Exit();

po prostu zmienia liste zadań wątku na listę pustą i wątek sam z siebie kończy działanie, jednak to nie rozwiązuje problemu bo teraz poprawne zamykanie działa tylko jak zamkniemy program specjalnie utworzonym przyciskiem, przy zamykaniu krzyżykiem oczywiście nadal jest to samo

2

To wstaw swój kod czyszczący listę zadań wątku w metodę obsługującą zdarzenie FormClosing.

1 użytkowników online, w tym zalogowanych: 0, gości: 1