2012-03-26 7 views
7

Tengo una tarea personalizada de MSBuild para xUnit.net. Cuando la tarea se está ejecutando, si presiono Ctrl + C, 'intenta' cancelar la tarea, pero por supuesto falla (ya que mi tarea no admite la cancelación). No hay cantidad de búsquedas de documentos de MSDN o Google-fu que hayan aterrizado en una solución. Como no puedo encontrar una interfaz obvia para implementar, supongo que tal vez la cancelación sea respaldada por alguna convención.¿Cómo se escribe una tarea de MSBuild para admitir la cancelación?

¿Alguien ha hecho esto antes, y sabe lo que se requiere para que la cancelación funcione?

Respuesta

14

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

+0

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! –

+0

"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! –

0

Sé que estás muy consciente de la jerarquía de tareas, pero en el offchance esto es lo que está buscando y es simplemente el hecho de que no se está implementando un ToolTask ...

Inside MSBuild 2nd ed dice (p118) de ToolTask.Cancel

Se invoca este método para cancelar la ejecución de la tarea. Una vez que MSBuild llama a este método, si la tarea no se completa, se terminará por la fuerza

No hay otras referencias a cancelación en el mismo.

+0

Sí, miré a eso, pero yo no dispongo de una herramienta externa, por lo ToolTask ​​definitivamente no es el bit de la derecha de la jerarquía. Supongo que podría simplemente complementar un método que se parece a eso y ver si MSBuild me llamó ... antes de recorrer ese camino, pensé que podría preguntar y ver si alguien lo había hecho alguna vez. –

+0

Cool, los dedos cruzados. @ Sayed Ibrahim Hashimi ¡Aquí es donde entras! .... –

+0

En el libro no teníamos espacio para cubrir esto. Es posible que estemos haciendo una actualización, en cuyo caso incluiré esto. –

Cuestiones relacionadas