首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否存在Process.Start的异步等效项?

是否存在Process.Start的异步等效项?
EN

Stack Overflow用户
提问于 2012-05-29 02:28:41
回答 8查看 89.9K关注 0票数 160

正如标题所暗示的,有没有一个等同于Process.Start (允许您运行另一个应用程序或批处理文件)的工具可以让我等待?

我正在玩一个小的控制台应用程序,这里似乎是使用异步和等待的完美位置,但我找不到任何关于这种情况的文档。

我的想法是这样的:

代码语言:javascript
复制
void async RunCommand()
{
    var result = await Process.RunAsync("command to run");
}
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-05-29 02:50:32

Process.Start()只启动进程,它不会等到它完成,所以将它设为async没有多大意义。如果你仍然想这样做,你可以做一些像await Task.Run(() => Process.Start(fileName))这样的事情。

但是,如果您希望异步等待进程完成,则可以结合使用the Exited eventTaskCompletionSource

代码语言:javascript
复制
static Task<int> RunProcessAsync(string fileName)
{
    var tcs = new TaskCompletionSource<int>();

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

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

    process.Start();

    return tcs.Task;
}
票数 219
EN

Stack Overflow用户

发布于 2015-07-18 22:38:35

以下是我基于svick's answer的观点。它添加了输出重定向、退出代码保留和稍微更好的错误处理(即使Process对象无法启动,也会将其释放):

代码语言:javascript
复制
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;
}
票数 61
EN

Stack Overflow用户

发布于 2021-01-20 14:48:27

在.Net 5.0中,有一个官方的内置WaitForExitAsync方法,因此您不必自己实现。此外,Python现在接受IEnumerable<string>形式的参数(类似于Python/Golang等其他编程语言)。

下面是一个示例:

代码语言:javascript
复制
public static async Task YourMethod() {
    var p = Process.Start("bin_name", new[]{"arg1", "arg2", "arg3"});
    await p.WaitForExitAsync().ConfigureAwait(false);
    // more code;
}
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10788982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档