1

カスタムコードアクティビティで長時間実行されているプロセスがあります。このアクティビティの実行中にビルドを停止しようとすると、エラーが返されます。

TFS215104:ビルドXXXXXXXXXXXXXの停止に失敗しました:ワークフローのキャンセル要求に応答しませんでした。

次に、ビルドログに次のように表示されます。

ビルドを停止できません。詳細:00:00:59.9843747に操作が完了しませんでした。

ワークフローをキャンセルできません。エージェントを再起動する必要があります。詳細:割り当てられたタイムアウト00:01:00内に操作が完了しませんでした。この操作に割り当てられた時間は、より長いタイムアウトの一部であった可能性があります。

サービス「XXXXXXX-コントローラー」:ビルド「XXXXXXXXXXX」が停止しました。詳細:ビルドはキャンセルされました。

このキャンセルリクエストはどのようにして私のアクティビティに戻りますか?バックグラウンドプロセスの使用方法は理解していますが、コード内でキャンセルリクエストをキャプチャする方法がわかりません。

4

2 に答える 2

1

私が読んだすべてのブログは、AsyncCodeActivityの代わりにCodeActivityを使用する方法を示しているようです。次に例を示します。

[BuildActivity(HostEnvironmentOption.All)]
    public partial class SourceCodeAnalysisAsync : AsyncCodeActivity
    {
        private CodeActivityContext _context;
        private bool _continue = true;

        protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
        {
            _context = context;
            var  doSomethingDelegate = new Action(DoSomething);
            context.UserState = doSomethingDelegate;
            return doSomethingDelegate.BeginInvoke(callback, state);
        }

        protected override void Cancel(AsyncCodeActivityContext context)
        {
            base.Cancel(context);
            _continue = false;
        }

        protected override void EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
        {
            var doSomethingDelegate = (Action)context.UserState;
            doSomethingDelegate.EndInvoke(result);
        }

        private void DoSomething()
        {
            if (File.Exists(@"C:\test.txt"))
            {
                File.Delete(@"C:\test.txt");
            }

            int i = 0;
            do
            {
                File.AppendAllText(@"C:\test.txt", string.Format("do something {0}\r\n", i));
                Thread.Sleep(1000);
                i++;
            } while (_continue && i < 30);
        }
    }
于 2012-11-28T19:55:56.607 に答える
1

CodeActivityクラスをベースとして使用していますか?

これによると、キャンセルをサポートしているため、 AsyncCodeActivityを試すことができます。

于 2012-11-28T18:50:50.117 に答える