如何编写MSBuild任务来支持取消?

Bra*_*son 8 msbuild msbuild-task

我有一个xUnit.net的自定义MSBuild任务.当任务运行时,如果我按Ctrl + C,它"尝试"取消任务,但当然失败(因为我的任务不支持取消).没有任何MSDN文档搜索或Google-fu已经获得解决方案.由于我找不到一个明显的接口来实现,我猜测可能通过一些约定来支持取消.

有没有人以前做过这个,知道取消工作需要什么?

小智 15

您的任务需要实现ICancelableTask.这是4.0中添加的非常简单的界面.

基本上你只需添加一个Cancel()方法.它必须随时可以在不同的线程上调用,并立即返回.然后,您的任务必须立即从Execute返回.通常,您在Cancel()中设置一个布尔标志.然后在你的任务中你通常会循环处理每个输入 - 例如,一个接一个地复制一个文件 - 并在每次迭代中检查标志; 如果这是真的,那就爆发吧.在此上下文中,从Execute返回true或false无关紧要.

如果您是从ToolTask​​派生的 - 如果您的任务产生了一个工具,那么强烈建议您这样做,因为它可以节省大量代码,处理异步日志记录等等 - 然后它已经自动处理取消.当取消发生时,它会杀死它产生的工具及其所有子项.在某些情况下,C++团队的任务会覆盖此默认行为,因此他们的编译器/链接器在返回之前有几秒钟的时间来清理其半写输出.

(琐事:当我第一次在MSBuild中实现这个时,我不小心偶尔将VS蓝屏放到了盒子里.这几乎是在VS10测试版中发布的,但是及时发现了.蓝屏是因为找出进程树的逻辑是错误的,并且会有时会杀死一个系统进程.糟糕.)