1

我在自定义代码活动中有一个长时间运行的过程。如果我在此活动运行时尝试停止构建,则会返回错误:

TFS215104:无法停止构建 XXXXXXXXXXXXX:它没有响应工作流取消请求。

然后在构建日志中我看到:

无法停止构建。详细信息:操作未在 00:00:59.9843747 完成。

无法取消工作流。代理需要重新启动。详细信息:操作未在分配的 00:01:00 超时内完成。分配给此操作的时间可能是较长超时的一部分。

服务“XXXXXXX - 控制器”:构建“XXXXXXXXXX”已停止。详细信息:构建已取消。

此取消请求如何使其恢复到我的活动?我了解如何使用后台进程,但我不确定如何在我的代码中捕获取消请求。

4

2 回答 2

1

您是否使用CodeActivity类作为您的基础?

根据this,您可以尝试AsyncCodeActivity,因为它支持取消。

于 2012-11-28T18:50:50.117 回答
1

我阅读的所有博客似乎都展示了如何使用 CodeActivity 而不是 AsyncCodeActivity。这是一个例子:

[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 回答