2011-03-14 18 views
8

Supongamos, no es una tarea que contiene las siguientes acciones aproximadamente:¿Cómo forzar la cancelación de una tarea?

Task someTask = new Task(() => { 

    while(!IsCancellationRequested) { 

    Do_something_over_a_long_period_of_time(); 
    token.ThrowIfCancellationRequested(); 

    Do_something_over_a_long_period_of_time(); 
    token.ThrowIfCancellationRequested(); 

    Do_something_over_a_long_period_of_time(); 
    token.ThrowIfCancellationRequested(); 
    } 
}); 
someTask.Start(); 

Y hay usuarios muy impacientes. Anhelan terminar mi solicitud de inmediato. No quieren esperar mientras se ejecuta una larga acción.

Solía ​​utilizar la clase Thread y pude abortar todos mis hilos inmediatamente con la invocación del comando Abort().

¿Cómo cancelo mis tareas inmediatamente?

Gracias.

+1

¿Has mirado BackgroundWorker? – HadleyHope

+0

@HadleyHope ¿Cómo resolvería Background Worker su problema? Es compatible con la cancelación de manera similar a las tareas – Kugel

Respuesta

2

Anhelan finalizar mi aplicación de inmediato. No quieren esperar mientras se ejecuta una larga acción.

De forma predeterminada, las tareas se ejecutan en el ThreadPool como tareas en segundo plano. Puede salir de forma segura de la aplicación sin preocuparse por los hilos de fondo.

Por lo tanto, si desea salir de su proceso no hay problema.

Tenga en cuenta que Thread.Abort() fue rápido pero no es seguro. Ni siquiera para una aplicación para dejar de fumar, pero entonces rara vez causaría un problema real.

+6

No creo que diría" no hay problema "- ¿Qué pasa si uno de esos hilos de fondo está a la mitad de escribir un archivo que la aplicación necesitará la próxima vez que se inicie? –

+0

Me he olvidado del ThreadPool y de las tareas en segundo plano. Funciona bien ahora. Gracias. –

+0

@Jon Tienes razón en principio, pero el OP solía usar Thread.Abort() ... –

18

No puede obligar a una tarea a abortar de forma no cooperativa. Anular un hilo de una manera descontrolada no es seguro y, por lo tanto, no se admite de forma deliberada.

usted debe hacer su Do_something_over_a_long_period_of_time llamadas canceladas en su lugar (es decir, ellos pasan el testigo, y hacer que ellos cheque regularmente también).

EDITAR: Como se señala en otra respuesta, puede matar la aplicación simplemente asegurándose de que todos los hilos de primer plano han terminado. Pero debe tener en cuenta que sus tareas no necesariamente han tenido la oportunidad de terminar limpiamente. Si están haciendo cosas como escribir archivos, es posible que desee esperar hasta que se note la cancelación, para evitar corromper el estado persistente.

+0

Gracias. Es muy útil para mi. –

+0

Entonces, si configuro una nueva Tarea que solo llama a un solo método GetDataThatRunsForTheNext40secs(), ¿entonces no hay forma de cancelar la tarea inmediatamente desde afuera? Los resultados de tal cancelación no importan, pero me gustaría que mi CPU haga cosas útiles lo antes posible. ¿Pensamientos? – Gishu

+0

@Gishu: no sé de ninguna manera que pueda hacerlo * de forma segura *, sin la cooperación de la tarea en cuestión. –

Cuestiones relacionadas