我有一个xUnit.net的自定义MSBuild任务。当任务运行时,如果我按Ctrl + C,它“尝试”取消任务,但当然失败(因为我的任务不支持取消)。没有任何MSDN文档搜索或Google-fu已经获得解决方案。由于我找不到一个明显的接口来实现,我猜测可能通过一些惯例来支持取消。
以前是否有人这样做过,并且知道取消工作需要什么?
答案 0 :(得分:15)
您的任务需要实施ICancelableTask。这是4.0中添加的非常简单的界面。
基本上你只需添加一个Cancel()方法。它必须随时可以在不同的线程上调用,并立即返回。然后,您的任务必须立即从Execute返回。通常,您在Cancel()中设置一个布尔标志。然后在你的任务中你通常会循环处理每个输入 - 例如,一个接一个地复制一个文件 - 并在每次迭代中检查标志;如果这是真的,那就爆发吧。在这种情况下,从Execute返回true或false无关紧要。
如果您是从ToolTask派生的 - 如果您的任务产生了一个工具,那么强烈建议您这样做,因为它可以节省大量代码,处理异步日志记录等等 - 然后它已经处理好了自动取消。当取消发生时,它会杀死它产生的工具及其所有子项。在某些情况下,C ++团队的任务会覆盖此默认行为,因此他们的编译器/链接器在返回之前有几秒钟的时间来清理其半写输出。
(琐事:当我第一次在MSBuild中实现这个时,我不小心偶尔让VS蓝屏这个盒子。这几乎是在VS10测试版中发布的,但是及时发现了。蓝屏是因为找出进程树的逻辑错了,有时会杀死一个系统进程。糟糕。)
丹
答案 1 :(得分:0)
我知道你很了解任务层次结构,但是这就是你正在寻找的东西,而这正是你没有实现ToolTask
......
Inside MSBuild 2nd ed说ToolTask.Cancel
调用此方法以取消任务执行。一旦这个方法被MSBuild调用,如果任务没有完成,它将被强制终止
其中没有其他提及取消的内容。