Su tarea debe implementar ICancelableTask. Es una interfaz muy simple agregada en 4.0.
Básicamente, acaba de agregar un método de Cancelar(). Debe estar listo para ser llamado en un hilo diferente, en cualquier momento, y regresar rápidamente. Su tarea debe entonces regresar de Execute rápidamente. Normalmente, establecería un indicador booleano dentro de Cancelar(). Luego, dentro de su tarea, normalmente tendría un bucle procesando cada entrada por turno, por ejemplo, copiando un archivo después de otro, y en cada iteración, revise el indicador; si es verdad, estalla. No importa si devuelve verdadero o falso de Execute en este contexto.
Si se deriva de ToolTask, si su tarea genera una herramienta, se recomienda encarecidamente que lo haga, ya que ahorra una gran cantidad de código, maneja el registro asincrónico y otras cosas, entonces ya maneja Cancelar automáticamente. Cuando sucede Cancel, mata la herramienta que engendró y todos sus hijos. Las tareas del equipo de C++ en algunos casos anulan este comportamiento predeterminado, de modo que su compilador/enlazador tiene unos segundos para limpiar sus salidas a medias antes de volver.
(Trivia: cuando implementé esto por primera vez en MSBuild, accidentalmente hice la pantalla blues VS de vez en cuando. Esto casi se envía en VS10 beta pero fue descubierto justo a tiempo. La pantalla azul era porque la lógica para descifrar el árbol de proceso era mal, y que a veces matar a un proceso del sistema. Vaya.)
Dan
Supongo que la razón por la que nunca vi esto fue porque es nuevo para 4.0, y mis tareas todavía se dirigen a 2.0. Es bueno saber, sin embargo, que cuando actualizo a 4.0 puedo comenzar a usar esto. ¡Gracias! –
"la lógica para descifrar el árbol de proceso era incorrecta, y a veces mataría un proceso del sistema. Vaya". +1 por ser capaz de resolver eso! Jajaja! –