Process.OutputDataReceived Ereignis

Definition

Tritt jedes Mal auf, wenn eine Anwendung eine Zeile in den umgeleiteten StandardOutput Datenstrom schreibt.

public:
 event System::Diagnostics::DataReceivedEventHandler ^ OutputDataReceived;
public event System.Diagnostics.DataReceivedEventHandler? OutputDataReceived;
public event System.Diagnostics.DataReceivedEventHandler OutputDataReceived;
[System.ComponentModel.Browsable(true)]
public event System.Diagnostics.DataReceivedEventHandler OutputDataReceived;
member this.OutputDataReceived : System.Diagnostics.DataReceivedEventHandler 
[<System.ComponentModel.Browsable(true)>]
member this.OutputDataReceived : System.Diagnostics.DataReceivedEventHandler 
Public Custom Event OutputDataReceived As DataReceivedEventHandler 
Public Event OutputDataReceived As DataReceivedEventHandler 

Ereignistyp

Attribute

Beispiele

Im folgenden Beispiel wird veranschaulicht, wie asynchrone Lesevorgänge für den umgeleiteten StandardOutput Datenstrom des ipconfig Befehls ausgeführt werden.

Im Beispiel wird ein Ereignisdelegat für den OutputHandler Ereignishandler erstellt und dem OutputDataReceived Ereignis zugeordnet. Der Ereignishandler empfängt Textzeilen aus dem umgeleiteten StandardOutput Datenstrom, formatiert den Text und speichert ihn in einer Ausgabezeichenfolge, die später im Konsolenfenster des Beispiels angezeigt wird.

using System;
using System.IO;
using System.Diagnostics;
using System.Text;

class StandardAsyncOutputExample
{
    private static int lineCount = 0;
    private static StringBuilder output = new StringBuilder();

    public static void Main()
    {
        Process process = new Process();
        process.StartInfo.FileName = "ipconfig.exe";
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.OutputDataReceived += new DataReceivedEventHandler((sender, e) =>
        {
            // Prepend line numbers to each line of the output.
            if (!String.IsNullOrEmpty(e.Data))
            {
                lineCount++;
                output.Append("\n[" + lineCount + "]: " + e.Data);
            }
        });

        process.Start();

        // Asynchronously read the standard output of the spawned process.
        // This raises OutputDataReceived events for each line of output.
        process.BeginOutputReadLine();
        process.WaitForExit();

        // Write the redirected output to this application's window.
        Console.WriteLine(output);

        process.WaitForExit();
        process.Close();

        Console.WriteLine("\n\nPress any key to exit.");
        Console.ReadLine();
    }
}
open System
open System.Diagnostics
open System.Text

let mutable lineCount = 0
let output = StringBuilder()

let proc = new Process()
proc.StartInfo.FileName <- "ipconfig.exe"
proc.StartInfo.UseShellExecute <- false
proc.StartInfo.RedirectStandardOutput <- true

proc.OutputDataReceived.AddHandler(
    DataReceivedEventHandler(fun _ e ->
        // Prepend line numbers to each line of the output.
        if not (String.IsNullOrEmpty e.Data) then
            lineCount <- lineCount + 1
            output.Append $"\n[{lineCount}]: {e.Data}" |> ignore)
)


proc.Start() |> ignore

// Asynchronously read the standard output of the spawned process.
// This raises OutputDataReceived events for each line of output.
proc.BeginOutputReadLine()
proc.WaitForExit()

// Write the redirected output to this application's window.
printfn $"{output}"

proc.WaitForExit()
proc.Close()

printfn "\n\nPress any key to exit."
stdin.ReadLine() |> ignore
Imports System.IO
Imports System.Diagnostics
Imports System.Text

Module Module1
    Dim lineCount As Integer = 0
    Dim output As StringBuilder = New StringBuilder()

    Sub Main()
        Dim process As New Process()
        process.StartInfo.FileName = "ipconfig.exe"
        process.StartInfo.UseShellExecute = False
        process.StartInfo.RedirectStandardOutput = True
        AddHandler process.OutputDataReceived, AddressOf OutputHandler
        process.Start()

        ' Asynchronously read the standard output of the spawned process. 
        ' This raises OutputDataReceived events for each line of output.
        process.BeginOutputReadLine()
        process.WaitForExit()

        Console.WriteLine(output)

        process.WaitForExit()
        process.Close()

        Console.WriteLine(Environment.NewLine + Environment.NewLine + "Press any key to exit.")
        Console.ReadLine()
    End Sub

    Sub OutputHandler(sender As Object, e As DataReceivedEventArgs)
        If Not String.IsNullOrEmpty(e.Data) Then
            lineCount += 1

            ' Add the text to the collected output.
            output.Append(Environment.NewLine + "[" + lineCount.ToString() + "]: " + e.Data)
        End If
    End Sub
End Module

Hinweise

Das OutputDataReceived Ereignis gibt an, dass das zugeordnete Process Element eine Zeile geschrieben hat, die mit einer Neuleitung (Wagenrücklauf( CR), Zeilenvorschub (LF) oder CR+LF) in den umgeleiteten Datenstrom beendet wurde StandardOutput .

Das Ereignis wird bei asynchronen Lesevorgängen aktiviert StandardOutput. Um asynchrone Lesevorgänge zu starten, müssen Sie den StandardOutput Datenstrom eines ProcessEreignisses umleiten, den OutputDataReceived Ereignishandler zum Ereignis hinzufügen und aufrufen BeginOutputReadLine. Anschließend signalisiert das OutputDataReceived Ereignis jedes Mal, wenn der Prozess eine Zeile in den umgeleiteten StandardOutput Datenstrom schreibt, bis der Prozess beendet oder aufruft CancelOutputRead.

Note

Die Anwendung, die die asynchrone Ausgabe verarbeitet, sollte die WaitForExit Methode aufrufen, um sicherzustellen, dass der Ausgabepuffer geleert wurde.

Gilt für:

Weitere Informationen