Tôi cần phải sinh ra một tiến trình con là một ứng dụng giao diện điều khiển, và nắm bắt đầu ra của nó.Làm thế nào để sinh ra một quá trình và nắm bắt STDOUT của nó trong .NET?
tôi đã viết lên đoạn mã sau cho một phương pháp:
string retMessage = String.Empty;
ProcessStartInfo startInfo = new ProcessStartInfo();
Process p = new Process();
startInfo.CreateNoWindow = true;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardInput = true;
startInfo.UseShellExecute = false;
startInfo.Arguments = command;
startInfo.FileName = exec;
p.StartInfo = startInfo;
p.Start();
p.OutputDataReceived += new DataReceivedEventHandler
(
delegate(object sender, DataReceivedEventArgs e)
{
using (StreamReader output = p.StandardOutput)
{
retMessage = output.ReadToEnd();
}
}
);
p.WaitForExit();
return retMessage;
Tuy nhiên, điều này không trả lại bất cứ điều gì. Tôi không tin sự kiện OutputDataReceived
đang được gọi lại hoặc lệnh WaitForExit()
có thể đang chặn luồng để nó sẽ không bao giờ gọi lại.
Bạn có lời khuyên nào không?
EDIT: Có vẻ như tôi đang cố gắng hết sức với cuộc gọi lại. Làm:
return p.StandardOutput.ReadToEnd();
Xuất hiện để hoạt động tốt.
Nếu bạn không tương tác với ứng dụng và chỉ quan tâm đến đầu ra của ứng dụng, bạn không nên sử dụng phương thức 'BeginOutputReadLine()' và 'Start()' của Async. Tôi đã tìm thấy những điều này là không đáng tin cậy, và đôi khi chúng có thể cắt bớt đầu của đầu ra của ứng dụng. –
Tại sao không 'retMessage = e.Data'? Mà là một chuỗi var đã :) – Nickon
@ FlySwat 7 năm sau đó, làm thế nào về đánh dấu một câu trả lời được chấp nhận? :-) –