ProcessStartInfo.RedirectStandardError Propriété

Définition

Obtient ou définit une valeur qui indique si la sortie d’erreur d’une application est écrite dans le StandardError flux.

public:
 property bool RedirectStandardError { bool get(); void set(bool value); };
public bool RedirectStandardError { get; set; }
member this.RedirectStandardError : bool with get, set
Public Property RedirectStandardError As Boolean

Valeur de propriété

true si la sortie d’erreur doit être écrite dans StandardError; sinon, false. La valeur par défaut est false.

Exemples

L’exemple suivant utilise la net use commande avec un argument fourni par l’utilisateur pour mapper une ressource réseau. Il lit ensuite le flux d’erreur standard de la commande net et l’écrit dans la console.

using (Process myProcess = new Process())
{
    ProcessStartInfo myProcessStartInfo = new ProcessStartInfo("net ", "use " + args[0]);

    myProcessStartInfo.UseShellExecute = false;
    myProcessStartInfo.RedirectStandardError = true;
    myProcess.StartInfo = myProcessStartInfo;
    myProcess.Start();

    StreamReader myStreamReader = myProcess.StandardError;
    // Read the standard error of net.exe and write it on to console.
    Console.WriteLine(myStreamReader.ReadLine());
}
Using myProcess As New Process()
    Dim myProcessStartInfo As New ProcessStartInfo("net ", "use " + args(0))

    myProcessStartInfo.UseShellExecute = False
    myProcessStartInfo.RedirectStandardError = True
    myProcess.StartInfo = myProcessStartInfo
    myProcess.Start()

    Dim myStreamReader As StreamReader = myProcess.StandardError
    ' Read the standard error of net.exe and write it on to console.
    Console.WriteLine(myStreamReader.ReadLine())
End Using

Remarques

Lorsqu’un Process texte écrit dans son flux d’erreur standard, ce texte est généralement affiché sur la console. En redirigeant le StandardError flux, vous pouvez manipuler ou supprimer la sortie d’erreur d’un processus. Par exemple, vous pouvez filtrer le texte, le mettre en forme différemment ou écrire la sortie dans la console et dans un fichier journal désigné.

Note

Vous devez définir la false valeur UseShellExecute si vous souhaitez définir la valeur RedirectStandardErrortrue. Sinon, la lecture à partir du StandardError flux lève une exception.

Le flux redirigé StandardError peut être lu de manière synchrone ou asynchrone. Méthodes telles que Read, ReadLine et ReadToEnd effectuer des opérations de lecture synchrones sur le flux de sortie d’erreur du processus. Ces opérations de lecture synchrones ne se terminent pas tant que les écritures associées Process n’ont pas été effectuées dans son StandardError flux ou ferment le flux.

En revanche, BeginErrorReadLine démarre les opérations de lecture asynchrones sur le StandardError flux. Cette méthode active un gestionnaire d’événements désigné pour la sortie du flux et retourne immédiatement à l’appelant, ce qui peut effectuer d’autres tâches pendant que la sortie du flux est dirigée vers le gestionnaire d’événements.

Note

L’application qui traite la sortie asynchrone doit appeler la Process.WaitForExit méthode pour s’assurer que la mémoire tampon de sortie a été vidée.

Les opérations de lecture synchrone introduisent une dépendance entre la lecture de l’appelant à partir du StandardError flux et l’écriture du processus enfant dans ce flux. Ces dépendances peuvent entraîner des conditions de blocage. Lorsque l’appelant lit à partir du flux redirigé d’un processus enfant, il dépend de l’enfant. L’appelant attend l’opération de lecture jusqu’à ce que l’enfant écrit dans le flux ou ferme le flux. Lorsque le processus enfant écrit suffisamment de données pour remplir son flux redirigé, il dépend du parent. Le processus enfant attend l’opération d’écriture suivante jusqu’à ce que le parent lise à partir du flux complet ou ferme le flux. La condition d’interblocage se produit lorsque l’appelant et le processus enfant attendent l’exécution d’une opération, et aucun des deux ne peut continuer. Vous pouvez éviter les interblocages en évaluant les dépendances entre l’appelant et le processus enfant.

Les deux derniers exemples de cette section utilisent la Start méthode pour lancer un exécutable nommé Write500Lines.exe. L’exemple suivant contient son code source.

using System;

public class Example3
{
    public static void Main()
    {
        for (int ctr = 0; ctr < 500; ctr++)
            Console.WriteLine($"Line {ctr + 1} of 500 written: {(ctr + 1) / 500.0:P2}");

        Console.Error.WriteLine("\nSuccessfully wrote 500 lines.\n");
    }
}
// The example displays the following output:
//      Line 1 of 500 written: 0,20%
//      Line 2 of 500 written: 0,40%
//      Line 3 of 500 written: 0,60%
//      ...
//      Line 498 of 500 written: 99,60%
//      Line 499 of 500 written: 99,80%
//      Line 500 of 500 written: 100,00%
//
//      Successfully wrote 500 lines.
Imports System.IO

Public Module Example
   Public Sub Main()
      For ctr As Integer = 0 To 499
         Console.WriteLine($"Line {ctr + 1} of 500 written: {(ctr + 1) / 500.0:P2}")
      Next

      Console.Error.WriteLine($"{vbCrLf}Successfully wrote 500 lines.{vbCrLf}")
   End Sub
End Module
' The example displays the following output:
'      Line 1 of 500 written 0,20%
'      Line 2 of 500 written: 0,40%
'      Line 3 of 500 written: 0,60%
'      ...
'      Line 498 of 500 written: 99,60%
'      Line 499 of 500 written: 99,80%
'      Line 500 of 500 written: 100,00%
'
'      Successfully wrote 500 lines.

L’exemple suivant montre comment lire à partir d’un flux d’erreurs redirigé et attendre la sortie du processus enfant. Il évite une condition d’interblocage en appelant p.StandardError.ReadToEnd avant p.WaitForExit. Une condition d’interblocage peut se produire si le processus parent appelle p.WaitForExit avant p.StandardError.ReadToEnd et que le processus enfant écrit suffisamment de texte pour remplir le flux redirigé. Le processus parent attendrait indéfiniment que le processus enfant se termine. Le processus enfant attend indéfiniment que le parent lise à partir du flux complet StandardError .

using System;
using System.Diagnostics;

public class Example
{
   public static void Main()
   {
      var p = new Process();  
      p.StartInfo.UseShellExecute = false;  
      p.StartInfo.RedirectStandardError = true;  
      p.StartInfo.FileName = "Write500Lines.exe";  
      p.Start();  

      // To avoid deadlocks, always read the output stream first and then wait.  
      string output = p.StandardError.ReadToEnd();  
      p.WaitForExit();

      Console.WriteLine($"\nError stream: {output}");
   }
}
// The end of the output produced by the example includes the following:
//      Error stream:
//      Successfully wrote 500 lines.
Imports System.Diagnostics

Public Module Example
    Public Sub Main()
        Dim p As New Process()
        p.StartInfo.UseShellExecute = False  
        p.StartInfo.RedirectStandardError = True  
        p.StartInfo.FileName = "Write500Lines.exe"  
        p.Start() 

        ' To avoid deadlocks, always read the output stream first and then wait.  
        Dim output As String = p.StandardError.ReadToEnd()  
        p.WaitForExit()

        Console.WriteLine($"{vbCrLf}Error stream: {output}")
    End Sub
End Module
' The end of the output produced by the example includes the following:
'      Error stream:
'      Successfully wrote 500 lines.

Il existe un problème similaire lorsque vous lisez tout le texte des flux d’erreur standard et de sortie standard. Le code C# suivant, par exemple, effectue une opération de lecture sur les deux flux. Elle évite la condition d’interblocage en effectuant des opérations de lecture asynchrones sur le StandardError flux. Une condition d’interblocage se produit si le processus parent appelle p.StandardOutput.ReadToEnd suivi et p.StandardError.ReadToEnd que le processus enfant écrit suffisamment de texte pour remplir son flux d’erreur. Le processus parent attendrait indéfiniment que le processus enfant ferme son StandardOutput flux. Le processus enfant attend indéfiniment que le parent lise à partir du flux complet StandardError .

using System;
using System.Diagnostics;

public class Example
{
    public static void Main()
    {
        var p = new Process();
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardOutput = true;
        string eOut = null;
        p.StartInfo.RedirectStandardError = true;
        p.ErrorDataReceived += new DataReceivedEventHandler((sender, e) =>
                                   { eOut += e.Data; });
        p.StartInfo.FileName = "Write500Lines.exe";
        p.Start();

        // To avoid deadlocks, use an asynchronous read operation on at least one of the streams.  
        p.BeginErrorReadLine();
        string output = p.StandardOutput.ReadToEnd();
        p.WaitForExit();

        Console.WriteLine($"The last 50 characters in the output stream are:\n'{output.Substring(output.Length - 50)}'");
        Console.WriteLine($"\nError stream: {eOut}");
    }
}
// The example displays the following output:
//      The last 50 characters in the output stream are:
//      'ritten: 99,80%
//      Line 500 of 500 written: 100,00%
//      '
//
//      Error stream: Successfully wrote 500 lines.
Imports System.Diagnostics

Public Module Example
   Public Sub Main()
      Dim p As New Process()  
      p.StartInfo.UseShellExecute = False  
      p.StartInfo.RedirectStandardOutput = True  
      Dim eOut As String = Nothing
      p.StartInfo.RedirectStandardError = True
      AddHandler p.ErrorDataReceived, Sub(sender, e) eOut += e.Data 
      p.StartInfo.FileName = "Write500Lines.exe"  
      p.Start()  

      ' To avoid deadlocks, use an asynchronous read operation on at least one of the streams.  
      p.BeginErrorReadLine()
      Dim output As String = p.StandardOutput.ReadToEnd()  
      p.WaitForExit()

      Console.WriteLine($"The last 50 characters in the output stream are:{vbCrLf}'{output.Substring(output.Length - 50)}'")
      Console.WriteLine($"{vbCrLf}Error stream: {eOut}")
   End Sub
End Module
' The example displays the following output:
'      The last 50 characters in the output stream are:
'      'ritten: 99,80%
'      Line 500 of 500 written: 100,00%
'      '
'
'      Error stream: Successfully wrote 500 lines.

Vous pouvez utiliser des opérations de lecture asynchrones pour éviter ces dépendances et leur potentiel d’interblocage. Vous pouvez également éviter la condition d’interblocage en créant deux threads et en lisant la sortie de chaque flux sur un thread distinct.

S’applique à

Voir aussi