Come posso garantire che tutti i thread del programma vengano interrotti dopo aver chiuso la finestra principale?Come posso forzare l'uscita di tutti i thread del programma alla chiusura del programma?
risposta
- Se è stata progettata la filettatura, è necessario disporre di un meccanismo per chiuderli, ad es. utilizzare un
ManualResetEvent
per segnalare loro di chiudere - È possibile Thread.join aspettare fino a che non si chiudono, o Thread.Abort di averli abortire in un modo brutto
- Se sono thread in background, si chiudono quando l'applicazione fa
Consulta anche: http://msdn.microsoft.com/en-us/library/7a2f3ay4(v=vs.80).aspx
Aggiungerò il commento standard - non usare mai l'abort (fai una ricerca qui su S/O per vedere tutti i dettagli sul perché è una pessima idea). –
Leggi perché, però, perché nella maggior parte dei casi è un compromesso perfettamente accettabile. "Non abortire mai" è sbagliato, ho paura. –
Punto giusto. Che ne dici di non farlo se non comprendi gli argomenti contro e non hai un'alternativa. –
raccoglierli da qualche parte, come ad esempio
static public List<Thread> AllThreads;
e l'uso che la raccolta a .Abort()
loro, uno per uno.
Questo è il HARD e WRONG modo. Meglio sarebbe quello di segnalare loro di fermarsi in qualche modo, e quindi .Join()
uno per uno.
Vuoi dire '.Abort()'? '.Terminate' non esiste –
Inoltre, se si dispone di un elenco, perché non' AllThreads.ForEach (t => t.Abort()); '? –
@KierenJohnstone quando ho detto di terminarli uno per uno, questo è esattamente ciò che intendevo. Lambda, o no, li stai chiudendo uno per uno. –
È possibile impostare la proprietà "IsBackground" true. Il CLR chiude tutti i thread in background quando l'applicazione viene chiusa.
Facendo in modo che il programma si chiuda effettivamente, es. non introdurre deliberatamente alcun codice che imponga al thread che esegue la finestra principale di attendere altri thread. Il thread che esegue la finestra principale sarà quindi libero di uscire da Process() e il sistema operativo interromperà tutti gli altri thread nel processo, indipendentemente da ciò che stanno facendo.
Rgds, Martin
Per impostazione predefinita su .NET, i thread che non sono in background significano che l'app non si limita semplicemente a "chiudere". Se chiami ExitProcess (che si chiama Environment.Exit nel mondo .NET), ciò funzionerebbe –
Oops - erroneamente il tag "C#": ((Sto facendo C++ al momento .. –
impostare la proprietà IsBackground
su true, e aggiungere le seguenti righe:
AppDomain.CurrentDomain.ProcessExit += CloseMe; // for the main process
AppDomain.CurrentDomain.DomainUnload += CloseMe; // for ApplicationDomains
lasciare che il metodo di CloseMe
impostato un flag che viene controllata nel ciclo principale del filo.
Prova
Application.ExitThread();
Environment.Exit(0);
o
Dispatcher.CurrentDispatcher.Thread.Abort();
- 1. Multi-Threading - Strategia di pulizia alla fine del programma
- 2. __del__ alla fine del programma
- 3. Come terminare/forzare la chiusura di un programma (in Clojure)
- 4. Esecuzione del programma di ruby su tutti i processori
- 5. Chiamare un metodo alla chiusura del thread
- 6. Come posso ottenere argomenti del programma Form?
- 7. Come posso profilare la memoria del programma multithread in Python?
- 8. Come posso catturare SIGINT nel threading del programma python?
- 9. Esce il programma di blocco del sonno? Come viene implementato?
- 10. Come posso forzare Windows a cancellare tutti i dati della cache di lettura del disco?
- 11. del programma java
- 12. Perché il mio output non viene visualizzato fino alla chiusura del programma?
- 13. printf flush all'uscita del programma
- 14. Modifica dello sfondo con un file batch, alla chiusura del programma. Possibile?
- 15. Utilizzo del programma di formattazione del codice Eclipse dal proprio programma
- 16. Come stampare l'utilizzo del programma in Perl?
- 17. Come automatizzare i test del programma di installazione
- 18. Semplice arresto anomalo del programma
- 19. Perché è l'uscita del programma?
- 20. eclipse java multithread debugging del programma
- 21. Rendi l'output del programma curses persistente nella cronologia di scrollback del terminale dopo l'uscita dal programma
- 22. GPU vs CPU? Numero di core/thread in una GPU per l'accelerazione del calcolo del programma?
- 23. Batch per forzare la chiusura di tutti i file excel
- 24. Come posso creare i thread del daemon?
- 25. Come posso ottenere il nome del programma in Racket?
- 26. Struttura del programma Java Swing
- 27. Controllare il debug del programma
- 28. Script del programma di riavvio Monit
- 29. Gestione del segnale nel programma parallelo OpenMP
- 30. fork in programma multi-thread
sono i fili Imposta come sfondo le discussioni? –
WPF o WinForms? – sll
@ LasseV.Karlsen: No – armin