Process.OutputDataReceived Händelse

Definition

Inträffar varje gång ett program skriver en rad till sin omdirigerade StandardOutput ström.

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

Händelsetyp

Attribut

Exempel

I följande exempel visas hur du utför asynkrona läsåtgärder på kommandots omdirigerade StandardOutput ström ipconfig .

Exemplet skapar en händelsedelegat för OutputHandler händelsehanteraren och associerar den med OutputDataReceived händelsen. Händelsehanteraren tar emot textrader från den omdirigerade StandardOutput strömmen, formaterar texten och sparar den i en utdatasträng som senare visas i exemplets konsolfönster.

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

Kommentarer

Händelsen OutputDataReceived anger att den associerade Process har skrivit en rad som avslutas med en ny rad (vagnretur (CR), radmatning (LF) eller CR+LF) till dess omdirigerade StandardOutput ström.

Händelsen aktiveras under asynkrona läsåtgärder på StandardOutput. Om du vill starta asynkrona läsåtgärder måste du omdirigera StandardOutput strömmen för en Process, lägga till händelsehanteraren i OutputDataReceived händelsen och anropa BeginOutputReadLine. Därefter OutputDataReceived signalerar händelsen varje gång processen skriver en rad till den omdirigerade StandardOutput strömmen tills processen avslutas eller anropar CancelOutputRead.

Note

Programmet som bearbetar asynkrona utdata bör anropa WaitForExit metoden för att säkerställa att utdatabufferten har tömts.

Gäller för

Se även