处理自定义代码活动中的取消请求

时间:2012-11-28 13:54:36

标签: c# tfs tfs2010 tfsbuild

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

  

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

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

  

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

     

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

     

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

此取消请求如何回复我的活动?我理解如何使用后台进程,但我不知道如何在我的代码中捕获取消请求。

2 个答案:

答案 0 :(得分:1)

您使用CodeActivity课程作为基础吗?

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

答案 1 :(得分: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);
        }
    }