我在自定义代码活动中有一个长时间运行的过程。如果我在此活动运行时尝试停止构建,则会返回错误:
TFS215104:无法停止构建XXXXXXXXXXXXX:它没有响应 工作流程取消请求。
然后在构建日志中我看到:
无法停止构建。详细信息:操作未完成 00:00:59.9843747
无法取消工作流程。需要重新启动代理。细节: 操作未在分配的超时00:01:00内完成。 分配给此操作的时间可能是a的一部分 更长的超时。
服务'XXXXXXX - 控制器':构建'XXXXXXXXXXX'已停止。 详细信息:构建已取消。
此取消请求如何回复我的活动?我理解如何使用后台进程,但我不知道如何在我的代码中捕获取消请求。
答案 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);
}
}