2011-10-07 19 views

Odpowiedz

13
  • Jeśli dobrze zaprojektowałeś gwintowanie, powinieneś mieć mechanizm, który je zamknie - np. używać ManualResetEvent je zasygnalizować, aby zamknąć
  • Można Thread.Join czekać aż do zamknięcia lub Thread.Abort aby je przerwać w paskudny sposób
  • Jeśli są wątki tła, będą zamknąć, gdy aplikacja działa

Zobacz także: http://msdn.microsoft.com/en-us/library/7a2f3ay4(v=vs.80).aspx

+0

Dodam standardowy komentarz - nigdy nie używaj przerwania (szukaj tutaj na S/O, aby zobaczyć wszystkie szczegóły, dlaczego jest to bardzo zły pomysł). –

+1

Czy czytaj dalej, dlaczego, ponieważ w większości przypadków jest to całkowicie dopuszczalny kompromis. "Nigdy nie używaj Przerwij" jest złe Obawiam się. –

+2

Punkt targów. A może nie rób tego, chyba że rozumiesz argumenty przeciw i nie masz alternatywy. –

0

Zbierz je gdzieś, takich jak

static public List<Thread> AllThreads; 

i wykorzystać tę kolekcję .Abort() je, jeden po drugim.

To jest sposób HARDWRONG. Lepiej byłoby zasygnalizować im, by jakoś zaprzestali, a następnie jeden po drugim: .Join().

+0

Masz na myśli '.Abort()'? '.Terminate' nie istnieje –

+0

Również, jeśli masz listę, dlaczego nie' AllThreads.ForEach (t => t.Abort()); '? –

+0

@KierenJohnstone kiedy powiedziałem, że kończą je jeden po drugim, dokładnie to miałem na myśli. Lambda, lub nie, kończysz je jeden po drugim. –

17

można ustawić "IsBackground" obiekt na true. Program CLR zamyka wszystkie wątki w tle po wyjściu aplikacji.

-2

Pozwalając programowi faktycznie zamknąć, tj. nie celowo wprowadzaj żadnego kodu, który zmusza wątek, który uruchamia główne okno, do oczekiwania na inne wątki. Wątek, który uruchamia główne okno, będzie wtedy wolny do exitProcess(), a system operacyjny przerwie wszystkie pozostałe wątki w twoim procesie, bez względu na to, co robią.

Rgds, Martin

+0

Domyślnie w .NET wątki, które nie są tłem, będą oznaczać, że aplikacja nie po prostu "zamknie". Jeśli wywołasz ExitProcess (który nazywa się Environment.Exit w świecie .NET), to zadziała –

+0

Ups - błędne odczytanie znacznika "C#": ((Robi C++ w tej chwili .. –

0

Ustaw właściwość IsBackground true, a następnie dodaj następujące linie:

AppDomain.CurrentDomain.ProcessExit += CloseMe; // for the main process 
AppDomain.CurrentDomain.DomainUnload += CloseMe; // for ApplicationDomains 

Niech metoda CloseMe ustawić flagę, który jest sprawdzany w pętli głównej nitki.

6

Spróbuj

Application.ExitThread(); 
Environment.Exit(0); 

lub

Dispatcher.CurrentDispatcher.Thread.Abort(); 
Powiązane problemy