我看到很多帖子等待各种活动的返回值,但在这种情况下,我想开始一项活动然后不等。我只想在(非常)慢的网络上复制一个目录,所以我不想创建另一个活动或使用批处理脚本。有人做过吗?有干净的方式吗?我可以把一些东西拼凑在一起,但我试图尽可能保持这种香味。
答案 0 :(得分:1)
我不认为您可以使用开箱即用的东西。
一种方法是组织一个“调用进程”,调用另一个进行实际复制的服务。因此,从Build内部开始,让被调用的实体(在TFS构建方面超出范围)执行实际活动。这确实存在某些缺陷,更重要的是,如果成功或失败,您将无法在构建日志中知道。
另一种选择是使用Parallel
活动(它位于“控制流”下的工具箱中 - System.Activities.Statements.Parallel
)。这不像你需要的那样(踢和忘记),它仍然可以让你在你的副本发生时做其他事情。
答案 1 :(得分:1)
以下是创建新流程的简单自定义活动:
[BuildActivity (HostEnvironmentOption.All)]
public sealed class InvokeProcessAsync : CodeActivity
{
[RequiredArgument]
public InArgument<string> FileName { get; set; }
public InArgument<string> Arguments { get; set; }
public InArgument<string> WorkingDirectory { get; set; }
public InArgument<IDictionary<string, string>> EnvironmentVariables { get; set; }
protected override void Execute (CodeActivityContext context)
{
context.DublicateOperationsLogsToBuildOutput ();
var psi = new ProcessStartInfo
{
FileName = context.GetValue (this.FileName),
Arguments = context.GetValue (this.Arguments),
WorkingDirectory = context.GetValue (this.WorkingDirectory)
};
var env_vars = context.GetValue (this.EnvironmentVariables);
if (env_vars != null)
{
foreach (var v in env_vars)
psi.EnvironmentVariables.Add (v.Key, v.Value);
}
Process.Start (psi);
}
}
答案 2 :(得分:-1)