正如标题所暗示的,有没有一个等同于Process.Start
(允许您运行另一个应用程序或批处理文件)的工具可以让我等待?
我正在玩一个小的控制台应用程序,这里似乎是使用异步和等待的完美位置,但我找不到任何关于这种情况的文档。
我的想法是这样的:
void async RunCommand()
{
var result = await Process.RunAsync("command to run");
}
发布于 2012-05-29 02:50:32
Process.Start()
只启动进程,它不会等到它完成,所以将它设为async
没有多大意义。如果你仍然想这样做,你可以做一些像await Task.Run(() => Process.Start(fileName))
这样的事情。
但是,如果您希望异步等待进程完成,则可以结合使用the Exited
event和TaskCompletionSource
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;
}
发布于 2015-07-18 22:38:35
以下是我基于svick's answer的观点。它添加了输出重定向、退出代码保留和稍微更好的错误处理(即使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;
}
发布于 2021-01-20 14:48:27
在.Net 5.0中,有一个官方的内置WaitForExitAsync方法,因此您不必自己实现。此外,Python现在接受IEnumerable<string>
形式的参数(类似于Python/Golang等其他编程语言)。
下面是一个示例:
public static async Task YourMethod() {
var p = Process.Start("bin_name", new[]{"arg1", "arg2", "arg3"});
await p.WaitForExitAsync().ConfigureAwait(false);
// more code;
}
https://stackoverflow.com/questions/10788982
复制相似问题