2011-10-07 14 views

risposta

13
  • 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

+0

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). –

+1

Leggi perché, però, perché nella maggior parte dei casi è un compromesso perfettamente accettabile. "Non abortire mai" è sbagliato, ho paura. –

+2

Punto giusto. Che ne dici di non farlo se non comprendi gli argomenti contro e non hai un'alternativa. –

0

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.

+0

Vuoi dire '.Abort()'? '.Terminate' non esiste –

+0

Inoltre, se si dispone di un elenco, perché non' AllThreads.ForEach (t => t.Abort()); '? –

+0

@KierenJohnstone quando ho detto di terminarli uno per uno, questo è esattamente ciò che intendevo. Lambda, o no, li stai chiudendo uno per uno. –

17

È possibile impostare la proprietà "IsBackground" true. Il CLR chiude tutti i thread in background quando l'applicazione viene chiusa.

-2

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

+0

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 –

+0

Oops - erroneamente il tag "C#": ((Sto facendo C++ al momento .. –

0

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.

6

Prova

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

o

Dispatcher.CurrentDispatcher.Thread.Abort(); 
Problemi correlati