2011-10-07 24 views

Respuesta

13
  • Si ha diseñado bien el subprocesamiento, debe tener un mecanismo para cerrarlos, p. Ej. utilizar un ManualResetEvent para señalar que cierren
  • Puede Thread.Join que esperar hasta que se cierran o Thread.Abort tenerlos abortan de manera desagradable
  • Si son hilos de fondo, que se cerrará cuando la aplicación hace

Consulte también: http://msdn.microsoft.com/en-us/library/7a2f3ay4(v=vs.80).aspx

+0

Agregaré el comentario estándar - nunca use abort (haga una búsqueda aquí en S/O para ver todos los detalles sobre por qué es una muy mala idea). –

+1

Sin embargo, lea sobre por qué, porque en la mayoría de los casos es un compromiso perfectamente aceptable. "Nunca uso abortar" es incorrecto, me temo. –

+2

Punto justo. ¿Qué tal si no lo haces a menos que comprendas los argumentos en contra y no tengas una alternativa? –

0

los recogen en algún lugar, como

static public List<Thread> AllThreads; 

y utilizar esa colección a .Abort() ellos, uno por uno.

Este es el DURO y MAL manera. Mejor sería señalarles que se detengan de alguna manera, y luego .Join() uno por uno.

+0

¿Quiere decir '.Abort()'? '.Terminate' no existe –

+0

Además, si tiene una lista, ¿por qué no' AllThreads.ForEach (t => t.Abort()); '? –

+0

@KierenJohnstone cuando dije terminarlos uno por uno, eso es exactamente lo que quise decir. Lambda, o no, los estás terminando uno a uno. –

17

Usted puede establecer la propiedad "IsBackground" true. CLR cierra todos los hilos de fondo cuando la aplicación sale.

-2

Dejando que el programa realmente cierre, es decir. no introduzca deliberadamente ningún código que fuerce al hilo que ejecuta la ventana principal a esperar otros hilos. El hilo que ejecuta la ventana principal será libre de salir de Process() y el sistema operativo abortará todos los otros hilos en su proceso, sin importar lo que estén haciendo.

Rgds, Martin

+0

De manera predeterminada en .NET, los hilos que no son de fondo significarán que la aplicación no se "cerrará". Si llama a ExitProcess (que se llama Environment.Exit en el mundo .NET), eso funcionaría –

+0

Vaya, leí mal la etiqueta 'C#': ((Haciendo C++ en este momento ... –

0

establecer la propiedad IsBackground true, y añadir las siguientes líneas:

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

dejar que el método CloseMe establece un indicador que se comprueba en el bucle principal de la rosca.

6

Trate

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

o

Dispatcher.CurrentDispatcher.Thread.Abort(); 
Cuestiones relacionadas