是否有任何异步的Process.Start?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (217)

就像标题所示,是否有一个等同于Process.Start(允许您运行另一个应用程序或批处理文件),我可以等待?

我正在玩一个小型控制台应用程序,这看起来像是使用异步和等待的完美场所,但我无法找到任何有关此场景的文档。

我在想什么是这样的:

void async RunCommand()
{
    var result = await Process.RunAsync("command to run");
}
提问于
用户回答回答于

Process.Start()只是开始这个​​过程,它不会等到它完成,所以它没有多大意义async。如果你仍然想这样做,你可以做类似的事情await Task.Run(() => Process.Start(fileName))

但是,如果要异步等待进程结束,可以使用Exited事件连同TaskCompletionSource

static Task RunProcessAsync(string fileName)
{
    // there is no non-generic TaskCompletionSource
    var tcs = new TaskCompletionSource<bool>();

    var process = new Process
    {
        StartInfo = { FileName = fileName },
        EnableRaisingEvents = true
    };

    process.Exited += (sender, args) =>
    {
        tcs.SetResult(true);
        process.Dispose();
    };

    process.Start();

    return tcs.Task;
}
用户回答回答于

它增加了输出重定向,退出代码保留以及稍微更好的错误处理(Process即使它无法启动,也要处理该对象):

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;
}

所属标签

可能回答问题的人

  • 最爱开车啦

    8 粉丝503 提问6 回答
  • 优惠活动秘书

    0 粉丝2 提问6 回答
  • uncle_light

    5 粉丝518 提问5 回答
  • Richel

    6 粉丝0 提问5 回答

扫码关注云+社区

领取腾讯云代金券