2009-09-11 10 views

Respuesta

9

No - al menos, no de forma limpia. (No incluyo Thread.Abort como "limpio".) Lo que debe hacer es tener un mecanismo para decirle al delegado que está intentando para cancelarlo. Su delegado deberá verificar ocasionalmente esa bandera de cancelación y reaccionar en consecuencia.

Las extensiones paralelas tienen una cancelación incorporada en todo el lugar (y en particular tokens de cancelación para permitir solo las piezas de código apropiadas para cancelar la tarea). Sin embargo, todo sigue siendo cooperativo, hasta donde yo sé. La cancelación forzada siempre correrá el riesgo de corromper el estado.

1

Como Jon ya ha indicado, no puede decir un hilo: "por favor, deténgase ahora" y espere que el hilo obedezca. Thread.Abort no le dirá que se detenga, simplemente lo "desconectará". :)

Lo que hice en el pasado fue agregar una serie de "if (wehavetostop)" dentro del código del thread y si el usuario presionó "cancel" puse wehavetostop == true.

No es demasiado elegante y en algunos casos puede ser "difícil" colocar los controles "if", especialmente si el hilo ejecuta una operación "larga" que no puede dividir.

Si está intentando establecer una conexión de red (y lleva tiempo) y realmente piensa que una terminación "anormal" del hilo no causaría ningún estado de corrupción, puede usarlo, pero recuerde que no puede confía en el estado de cosas que estuvieron involucradas en ese hilo.

5

Puede usar System.ComponentModel.BackgroundWorker. Es compatible con la cancelación para que no tenga que escribir el código repetitivo. El código de cliente puede simplemente llamar al método CancelAsyn y puede verificar la propiedad CancellationPending dentro de su código cuando y donde tenga sentido determinar si el cliente ha cancelado la operación y rescatado.

Cuestiones relacionadas