私の TFS2012 ビルド ワークフローには Parallel アクティビティがあり、いくつかのブランチ内には try-finally アクティビティがあります。1 つのブランチが失敗した場合 (たとえば、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
内部で例外が発生したときに finally が実行try
され、すべてがキャンセルされたときに実行されないアクティビティをどうにかして持つことはできますか?- そうでない場合は、ワークフローがキャンセルされ
if
たブロック内に追加し、長いことをしたくありません。finally
ワークフローがキャンセルされたことを知るにはどうすればよいですか?
編集:このパターンは、TFS2012 に付属する DefaultTemplate.11.1.xaml にも表示されます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>