以您编写的形式编写的代码(几乎)可以:process。启动在另一个进程中指定的进程,这样,输出流读取将与进程执行并行进行。不过,有一个问题是,您最终应该引发对process.waitforexit的调用—输出流关闭并不意味着进程已终止。
但是,如果尝试同时读取进程的stdout和stderr,则会遇到同步读取问题:无法同时同步读取2个流-如果读取stdout和进程正在写入stderr并等待消耗其输出,则会死锁,反之亦然。
要调解此问题,您可以订阅OutputDataReceived和ErrorDataReceived,如下所示:
type ProcessResult = { exitCode : int; stdout : string; stderr : string }
let executeProcess (exe,cmdline) =
let psi = new System.Diagnostics.ProcessStartInfo(exe,cmdline)
psi.UseShellExecute <- false
psi.RedirectStandardOutput <- true
psi.RedirectStandardError <- true
psi.CreateNoWindow <- true
let p = System.Diagnostics.Process.Start(psi)
let output = new System.Text.StringBuilder()
let error = new System.Text.StringBuilder()
p.OutputDataReceived.Add(fun args -> output.Append(args.Data) |> ignore)
p.ErrorDataReceived.Add(fun args -> error.Append(args.Data) |> ignore)
p.BeginErrorReadLine()
p.BeginOutputReadLine()
p.WaitForExit()
{ exitCode = p.ExitCode; stdout = output.ToString(); stderr = error.ToString() }
您还可以沿着以下几行写一些东西:
async {
while true do
let! args = Async.AwaitEvent p.OutputDataReceived
...
} |> Async.StartImmediate
用于F型反应性事件处理。