Pregunta

¿Hay alguna manera de cancelar los subprocesos creados con QueueUserWorkItem?

¿O tal vez no lo necesito?¿Qué sucede si se cierra la aplicación principal?¿Todos los hilos creados a partir de él se cancelan automáticamente?

¿Fue útil?

Solución

No es necesario abortarlos.Cuando su aplicación se cierre, .NET eliminará cualquier subproceso con IsBackground = true.El grupo de subprocesos .NET tiene todos sus subprocesos configurados en IsBackground = true, por lo que no tiene que preocuparse por eso.

Ahora, si está creando subprocesos actualizando la clase Thread, deberá abortarlos o establecer su propiedad IsBackground en verdadero.

Otros consejos

Sin embargo, si está utilizando recursos no administrados en esos hilos, puede terminar en muchos problemas.

Eso dependería más bien de cómo los estuviera usando: si estos recursos no administrados estuvieran empaquetados correctamente, serían tratados mediante la finalización de su contenedor, independientemente del mecanismo utilizado para eliminar los subprocesos que hacían referencia a ellos. Y el sistema operativo libera recursos no administrados cuando una aplicación se cierra de todos modos.

Existe una sensación general de que las aplicaciones (de Windows) pasan demasiado tiempo intentando limpiar cuando se cierra la aplicación, lo que a menudo implica paginar grandes cantidades de memoria sólo para poder descartarla nuevamente (o paginar código que se ejecuta alrededor). liberar objetos no administrados que el sistema operativo manejaría de todos modos).

El grupo de subprocesos utiliza subprocesos en segundo plano.Por lo tanto, todos se cerrarán automáticamente cuando se cierre la aplicación.

Si desea cancelar un hilo usted mismo, tendrá que administrar el hilo usted mismo (para poder llamar a Thread.Abort() en el objeto del hilo) o tendrá que configurar algún tipo de mecanismo de notificación que le permita dígale al hilo que debería abortar.

Sí lo harán.Sin embargo, si utiliza recursos no administrados en esos subprocesos, puede terminar en muchos problemas.

sí, están en segundo plano, pero por ejemplo, si tienes una aplicación en la que usas ThreadPool para algunas descargas múltiples o cosas así, y quieres detenerlas, ¿cómo lo haces?mi sugerencia sería:salir del hilo lo antes posible, f.ex

bool stop = false;
void doDownloadWork(object s) 
{
   if (!stop)
   {
       DownloadLink((String)s, location);
   }
}

y si establece stop = true, los segundos subprocesos (actualmente en cola) salen automáticamente, después de que los subprocesos de la cola finalizan su proceso.

Según la respuesta de Lukas Šalkauskas.

Pero deberías usar:

volatile bool stop = false;

para indicarle al compilador que esta variable es utilizada por varios subprocesos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top