Активность TFS для InvokeProcess (без ожидания) - PullRequest
2 голосов
/ 28 января 2012

Я вижу много сообщений, ожидающих возврата значений различных действий, но в этом случае я хотел бы запустить действие, а затем не ждать. Я просто хочу скопировать каталог по (очень) медленной сети, поэтому я бы предпочел не создавать другое действие или использовать для этого пакетный скрипт. Кто-нибудь сделал это? Есть ли чистый способ? Я мог бы что-то сделать вместе, но я стараюсь сделать это как можно более ванильным.

Ответы [ 3 ]

1 голос
/ 30 января 2012

Я не думаю, что что-то из коробки доступно для вас, чтобы использовать.

Одним из способов продолжения является организация «процесса вызова», который вызывает другую службу, которая выполняет фактическое копирование.Таким образом, в рамках Build вы продвигаетесь и позволяете активированной сущности (которая выходит за рамки сборки TFS) выполнять фактические действия.Это связано с определенными недостатками, более важным из которых является то, что вы никогда не узнаете в своих журналах сборки, если это удалось или не удалось.

Другой вариант - использовать действие Parallel (оно находится в панели инструментовв разделе «Контроль потока» - System.Activities.Statements.Parallel).Это не совсем то, что вам нужно (пните и забудьте), но оно может позволить вам делать другие вещи, пока происходит копирование.

1 голос
/ 25 апреля 2013

Вот простое пользовательское действие, которое создаст новый процесс:

[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);
    }
}
0 голосов
/ 28 января 2012

CopyDirectory действие из сборки Build.Workflow - это то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...