在我的 TFS2012 构建工作流程中,我有一个 Parallel 活动,并且在一些分支中我有 try-finally 活动。如果一个分支失败(例如,使用 CodeAnalysis 编译发现 CodeAnalysis 错误),则其他分支将被取消。但是,如果一个分支在一个包含块的 try 块内finally
,则 finally 块运行,如果花费超过 30 秒,则取消失败,并显示:
BuildWarning: The workflow instance accepted a stop request but did not complete within 00:00:29.9922015. This may indicate an AsyncCodeActivity is active that does not support cancellation.
我想避免这样的消息,所以:
- 我可以以某种方式进行
try-finally
最终运行的活动,当在内部引发异常时try
,而不是在整个事情被取消时? - 如果没有,我想
if
在块内添加一个finally
工作流已被取消的块,而不是做长时间的事情。我如何知道工作流已被取消?
编辑:这种模式甚至出现在 TFS2012 附带的 DefaultTemplate.11.1.xaml 中 - CopyDirectory 可能需要很长时间,但它位于TryCatch.Finally
:
<TryCatch DisplayName="Try Compile, Test, and Associate Changesets and Work Items">
<TryCatch.Finally>
<Sequence DisplayName="Revert Workspace and Copy Files to Drop Location">
<mtbwa:InvokeForReason DisplayName="Revert Workspace for Shelveset Builds" Reason="CheckInShelveset, ValidateShelveset">
<mtbwa:RevertWorkspace DisplayName="Revert Workspace" Workspace="[Workspace]" />
</mtbwa:InvokeForReason>
<If Condition="[Not String.IsNullOrEmpty(DropLocation)]" DisplayName="If DropLocation is Set">
<If.Then>
<mtbwa:CopyDirectory DisplayName="Drop Files to Drop Location" Source="[BinariesDirectory]" Destination="[DropLocation]" />
</If.Then>
</If>
</Sequence>
</TryCatch.Finally>
<TryCatch.Try>
(...)
</TryCatch.Try>
</TryCatch>