[C#] ¿Hay algún equivalente asíncrono de Process.Start?


Answers

Aquí está mi opinión, basada en la respuesta de svick . Agrega una redirección de salida, retención de código de salida y un manejo de error ligeramente mejor (eliminando el objeto de Process incluso si no se pudo iniciar):

public static async Task<int> RunProcessAsync(string fileName, string args)
{
    using (var process = new Process
    {
        StartInfo =
        {
            FileName = fileName, Arguments = args,
            UseShellExecute = false, CreateNoWindow = true,
            RedirectStandardOutput = true, RedirectStandardError = true
        },
        EnableRaisingEvents = true
    })
    {
        return await RunProcessAsync(process).ConfigureAwait(false);
    }
}    
private static Task<int> RunProcessAsync(Process process)
{
    var tcs = new TaskCompletionSource<int>();

    process.Exited += (s, ea) => tcs.SetResult(process.ExitCode);
    process.OutputDataReceived += (s, ea) => Console.WriteLine(ea.Data);
    process.ErrorDataReceived += (s, ea) => Console.WriteLine("ERR: " + ea.Data);

    bool started = process.Start();
    if (!started)
    {
        //you may allow for the process to be re-used (started = false) 
        //but I'm not sure about the guarantees of the Exited event in such a case
        throw new InvalidOperationException("Could not start process: " + process);
    }

    process.BeginOutputReadLine();
    process.BeginErrorReadLine();

    return tcs.Task;
}
Question

Como sugiere el título, ¿hay un equivalente a Process.Start (le permite ejecutar otra aplicación o archivo por lotes) que puedo esperar?

Estoy jugando con una pequeña aplicación de consola y este parece ser el lugar perfecto para usar asincrónica y esperar, pero no puedo encontrar ninguna documentación para este escenario.

Lo que estoy pensando es algo en esta línea:

void async RunCommand()
{
    var result = await Process.RunAsync("command to run");
}