Asp.net 第二个命令的StandardOutput.ReadToEnd()挂起
我必须使用asp.net中的进程运行两个命令,如下所示,第一个命令运行成功,而第二个命令挂起在result=p.StandardOutput.ReadToEnd() 如何实现这一点以成功运行这两个命令Asp.net 第二个命令的StandardOutput.ReadToEnd()挂起,asp.net,process,Asp.net,Process,我必须使用asp.net中的进程运行两个命令,如下所示,第一个命令运行成功,而第二个命令挂起在result=p.StandardOutput.ReadToEnd() 如何实现这一点以成功运行这两个命令 private static string FFMPEG_EXE_PATH = @"D:\ffmpeg\bin\ffmpeg.exe"; private static string FFPROBE_EXE_PATH = @"D:\ffmpeg\bin\ffprobe.exe"; protecte
private static string FFMPEG_EXE_PATH = @"D:\ffmpeg\bin\ffmpeg.exe";
private static string FFPROBE_EXE_PATH = @"D:\ffmpeg\bin\ffprobe.exe";
protected void Page_Load(object sender, EventArgs e)
{
string firstArgs = @"-hide_banner -show_format -show_streams -pretty D:\Video\dolbycanyon.m4v";
var result1 = Execute(FFPROBE_EXE_PATH, firstArgs);
string secondArgs = @"-hide_banner -ss 00:00:05 -i D:\Video\dolbycanyon.m4v -r 1 -t 1 -f image2 D:\Video\test.jpg";
var result2 = Execute(FFMPEG_EXE_PATH, secondArgs);
}
private string Execute(string exePath, string parameters)
{
string result = String.Empty;
using (Process p = new Process())
{
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = exePath;
p.StartInfo.Arguments = parameters;
p.Start();
result = p.StandardOutput.ReadToEnd(); // the application hung here for the second command
p.WaitForExit();
}
return result;
}
我已将Execute方法更改为如下所示,它适用于两个命令
public string Execute(string path, string args, int timeoutMs)
{
using (var outputWaitHandle = new ManualResetEvent(false))
{
using (var process = new Process())
{
process.StartInfo = new ProcessStartInfo(path);
process.StartInfo.Arguments = args;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.CreateNoWindow = true;
var sb = new StringBuilder(1024);
process.OutputDataReceived += (sender, e) =>
{
sb.AppendLine(e.Data);
if (e.Data == null)
{
outputWaitHandle.Set();
}
};
process.Start();
process.BeginOutputReadLine();
process.WaitForExit(timeoutMs);
outputWaitHandle.WaitOne(timeoutMs);
process.CancelOutputRead();
return sb.ToString();
}
}
}
您是否尝试过手动运行第二个命令以查看其挂起的原因?@Martin是的,第二个命令在命令提示符下运行顺利。