2012-03-26 6 views
7

xUnit.net用のカスタムMSBuildタスクがあります。タスクが実行されているときに、Ctrl + Cキーを押すと、タスクをキャンセルしようとしますが、もちろん失敗します(私のタスクはキャンセルをサポートしていないので)。 MSDNのドキュメント検索やGoogle-fuの量は決まっていません。実装する明白なインタフェースが見つからないので、私はおそらくキャンセルはいくつかの慣例の方法でサポートされていると推測しています。キャンセルをサポートするためにMSBuildタスクをどのように記述しますか?

これまで誰もこれをやったことがあり、取り消しを動作させるために何が必要なのか分かっていますか?

答えて

14

あなたのタスクはICancelableTaskを実装する必要があります。これは4.0で追加された非常にシンプルなインターフェイスです。

基本的には、Cancel()メソッドを追加するだけです。いつでも別のスレッドで呼び出す準備ができている必要があります。タスクはExecuteからすぐに戻る必要があります。通常は、Cancel()内にブール値フラグを設定します。あなたのタスクの内部では、通常、各入力を順番に処理するループがあります。たとえば、あるファイルを別のファイルにコピーするなど、各繰り返しでフラグを確認します。それが本当であれば、中断してください。このコンテキストでExecuteからtrueまたはfalseを返すかどうかは関係ありません。

ToolTask​​から派生している場合 - タスクがツールを生成する場合は、大量のコードを保存し、非同期ログなどを処理するため、ツールを起動することを強くお勧めします自動的に取り消しを処理します。キャンセルが発生すると、それは生成したツールとそのすべての子を強制終了します。場合によってはC++チームのタスクがこのデフォルトの動作をオーバーライドするので、コンパイラ/リンカーは、ハーフ・ライトされた出力をクリーン・アップしてから戻すまでに数秒かかります。

(トリビュア:MSBuildでこれを初めて実装したとき、私は間違ってVSブルースクリーンを時々ボックスに入れました。これはVS10ベータ版ではほとんど出荷されましたが、ちょうど間に合って発見されました。間違った、そして時にはおっと。システム・プロセスを殺すでしょう。)

ダン

+0

私はこれを見た理由がないと思うのですが、これは4.0の新機能で、私のタスクはまだ2.0をターゲットにしているからです。しかし、4.0にアップグレードすると、これを使い始めることができます。ありがとう! –

+0

"プロセスツリーを把握するためのロジックが間違っていて、システムプロセスを強制終了することがありました。それを理解するために+1!ハハハッハッハ! –

0

私はあなたがタスクの階層をよく知っている知っているが、offchanceに、これはあなたが探しているものであり、あなたがToolTask ...

Inside MSBuild 2nd edは言うを実装していないということだけで事実です(p118)のToolTask.Cancel

このメソッドは、タスクの実行をキャンセルするために呼び出されます。このメソッドがMSBuildによって呼び出されると、タスクが完了しなかった場合、強制終了されます。

他の参照はありません。

+0

ええ、私はそれを見て、私は外部ツールを実行していないので、ToolTask​​はほとんど間違いなく階層の右ビットではありません。 MSBuildが私に電話したかどうかを確認する方法を補完することができると思います。しかし、私がその道を歩き回る前に誰かがそれをやったことがあるかどうか聞いてみました。 –

+0

クール、指が交差しました。 @ Sayed Ibrahim Hashimiこれはあなたが一歩足を踏み入れる場所です! .... –

+0

本では、これをカバーするためのスペースがありませんでした。私たちは更新を行っているかもしれませんが、その場合はこれを含めます。 –