Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写MSBuild任务以支持取消?_Msbuild_Msbuild Task - Fatal编程技术网

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

如何编写MSBuild任务以支持取消?,msbuild,msbuild-task,Msbuild,Msbuild Task,我有一个xUnit.net的自定义MSBuild任务。当任务运行时,如果我按Ctrl+C,它会“尝试”取消任务,但当然会失败(因为我的任务不支持取消)。没有多少MSDN文档搜索或Google fu找到解决方案。因为我找不到一个明显的接口来实现,我猜可能是通过某种约定支持取消 以前有没有人做过这件事,并且知道需要什么才能让取消生效?我知道您很清楚任务的层次结构,但很可能这就是您正在寻找的,这只是您没有实现工具任务的事实 表示(p118)的工具任务。取消 调用此方法以取消任务执行。MSBuild调用

我有一个xUnit.net的自定义MSBuild任务。当任务运行时,如果我按Ctrl+C,它会“尝试”取消任务,但当然会失败(因为我的任务不支持取消)。没有多少MSDN文档搜索或Google fu找到解决方案。因为我找不到一个明显的接口来实现,我猜可能是通过某种约定支持取消


以前有没有人做过这件事,并且知道需要什么才能让取消生效?

我知道您很清楚任务的层次结构,但很可能这就是您正在寻找的,这只是您没有实现
工具任务的事实

表示(p118)的
工具任务。取消

调用此方法以取消任务执行。MSBuild调用此方法后,如果任务未完成,它将被强制终止


其中没有其他关于取消的引用。

您的任务需要执行。这是4.0中添加的一个非常简单的界面

基本上,您只需添加一个Cancel()方法。它必须随时准备在不同的线程上调用,并立即返回。然后,您的任务必须立即从“执行”返回。通常在Cancel()中设置一个布尔标志。然后在任务中,通常会有一个循环依次处理每个输入——例如,一个接一个地复制一个文件——并在每次迭代中检查标志;如果这是真的,就爆发出来。在这个上下文中,从Execute返回true还是false并不重要

如果您是从ToolTask派生的--如果您的任务生成了一个工具,强烈建议您这样做,因为它可以节省大量代码、处理异步日志记录和其他事情--那么它已经自动处理Cancel了。当取消发生时,它将杀死它生成的工具及其所有子工具。C++团队的任务在某些情况下重写此默认行为,以便编译器/链接器在返回之前有几秒钟的时间来清理其半书面输出。
(琐事:当我第一次在MSBuild中实现此功能时,偶尔会意外地将VS bluescreen置于框中。这几乎是在VS10 beta中发布的,但被及时发现。之所以出现bluescreen,是因为用于计算进程树的逻辑错误,有时会杀死系统进程。Oops。)


Dan

是的,我看过了,但我没有运行外部工具,所以ToolTask绝对不是正确的层次结构。我想我可以补充一个类似的方法,看看MSBuild是否调用了我。。。在我沿着这条路走之前,我想我应该问问有没有人做过这件事。在这本书中,我们没有足够的篇幅来讲述这件事。我们可能正在做一个更新,在这种情况下,我将包括这个。我猜我从来没有看到这一点的原因是因为它是4.0的新版本,我的任务仍然针对2.0。不过,很高兴知道,当我升级到4.0时,我就可以开始使用它了。谢谢“计算进程树的逻辑是错误的,有时会杀死一个系统进程。Oops。”+1表示能够计算出来!哈哈哈!