मैंने एक प्रतिक्रियाशील संस्करण बनाया जो stdOut और StdErr के लिए कॉलबैक स्वीकार करता है।
onStdOut
और
जैसे ही डेटा आता है (प्रक्रिया से बाहर निकलने से पहले) onStdErr
को अतुल्यकालिक
रूप से कहा जाता है ।
public static Int32 RunProcess(String path,
String args,
Action<String> onStdOut = null,
Action<String> onStdErr = null)
{
var readStdOut = onStdOut != null;
var readStdErr = onStdErr != null;
var process = new Process
{
StartInfo =
{
FileName = path,
Arguments = args,
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardOutput = readStdOut,
RedirectStandardError = readStdErr,
}
};
process.Start();
if (readStdOut) Task.Run(() => ReadStream(process.StandardOutput, onStdOut));
if (readStdErr) Task.Run(() => ReadStream(process.StandardError, onStdErr));
process.WaitForExit();
return process.ExitCode;
}
private static void ReadStream(TextReader textReader, Action<String> callback)
{
while (true)
{
var line = textReader.ReadLine();
if (line == null)
break;
callback(line);
}
}
उदाहरण उपयोग
निम्नलिखित प्रिंट के executable
साथ चलेगाargs
- stdOut सफेद में
- stdErr लाल रंग में
सांत्वना देने के लिए।
RunProcess(
executable,
args,
s => { Console.ForegroundColor = ConsoleColor.White; Console.WriteLine(s); },
s => { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(s); }
);