Piszę aplikację w języku C#, która w pewnym momencie uruchamia aplikację jako proces potomny przy użyciu klasy Proces z Asynchroniczne IO przekierowanie, jak pokazano poniżej:Jak asynchronicznie przekierować TYLKO standardowy strumień błędów, a nie standardowy strumień wyjściowy procesu w C#, .net
private void AppLaunch_Click(object sender, RoutedEventArgs e)
{
Process appProcess = new Process();
appProcess.StartInfo.FileName = currAppPath;
appProcess.StartInfo.Arguments = "";
//Setup Redirection
appProcess.StartInfo.UseShellExecute = false;
appProcess.StartInfo.ErrorDialog = false;
appProcess.StartInfo.RedirectStandardError = true;
appProcess.EnableRaisingEvents = true;
// Attach Output Handler
appProcess.ErrorDataReceived += appProc_DataReceived;
appProcess.Exited += appProc_Exited;
buildLogConsoleOutputTxtbox.AppendText(currAppPath + "\n");
appProcess.Start();
appProcess.BeginErrorReadLine();
}
private void appProc_DataReceived(object sender, DataReceivedEventArgs e)
{
if (!String.IsNullOrEmpty(e.Data))
{
this.appendLogText(e.Data);
}
}
private void appProc_Exited(object sender, System.EventArgs e)
{
Process proc = (Process)sender;
// Wait a short while to allow all console output to be processed and appended
Thread.Sleep(40);
this.appendLogText("\n>>");
proc.Close();
}
private void appendLogText(string logText)
{
// Use a delegate if called from a different thread,
// else just append the text directly
if (buildLogConsoleOutputTxtbox.Dispatcher.CheckAccess())
{
// Thread owns the TextBox
buildLogConsoleOutputTxtbox.AppendText(logText + Environment.NewLine);
}
else
{
//Invocation Required
appendLogCallBack appendLog = new appendLogCallBack(buildLogConsoleOutputTxtbox.AppendText);
buildlogScrollEnd buildlogscrl = new buildlogScrollEnd(buildLogConsoleOutputTxtbox.ScrollToEnd);
buildLogConsoleOutputTxtbox.Dispatcher.BeginInvoke(appendLog, new object[] { logText + Environment.NewLine });
buildLogConsoleOutputTxtbox.Dispatcher.BeginInvoke(buildlogscrl);
}
problem ten kawałek kodu jest to, że podczas gdy ja dostać stderr przekierowywany odpowiednio do mojego tekstowym, to przekierowanie wydaje hide się proces wyjściowe wyjście, którego nie chcę przekierować!
Jeśli przekierowuję standardowe wyjście, widzę, że został poprawnie przekierowany, ale czy nie jest możliwe przekierowanie stderr, a nie standardowe wyjście? Rozejrzałem się i szukałem w Google informacji na ten temat, ale wszystkie dyskusje wydają się być związane z przekierowywaniem stdouta ... takiego jak: How to asynchronously read the standard output stream and standard error stream at once
Byłbym wdzięczny za każdą pomoc dotyczącą tego!
Na pewno nie da się tego zrobić - flagą jest "przekierowanie wszystkich uchwytów", w takim przypadku wszystkie standardowe uchwyty procesów są teraz za ciebie odpowiedzialne. Jeśli chcesz, aby standardowe wyjście zapisywało się na konsoli macierzystej, możesz po prostu je przeczytać, a następnie zapisać je z powrotem tam, gdzie chcesz (np. Konsola). – Justin
Ale jaki jest sens posiadania dwóch poniższych instrukcji, jeśli zawsze jest przekierowywany? ? 'StartInfo.RedirectStandardError = true; StartInfo.RedirectStandardOutput = true lub false // w tym przypadku; 'Również chcę stdout napisać do konsoli dziecka, w przeciwnym razie mogę tylko dodać polecenie Console.WriteLine() w prawym obsługi? – bethrezan