Process.OutputDataReceived Händelse
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
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.