Process.OutputDataReceived Событие

Определение

Происходит каждый раз, когда приложение записывает строку в перенаправленный StandardOutput поток.

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 

Тип события

Атрибуты

Примеры

В следующем примере показано, как выполнять асинхронные операции чтения в перенаправленном StandardOutput потоке ipconfig команды.

В примере создается делегат события для обработчика OutputHandler событий и связывает его с событием OutputDataReceived . Обработчик событий получает текстовые строки из перенаправленного StandardOutput потока, форматирует текст и сохраняет его в выходной строке, которая позже показана в окне консоли примера.

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

Комментарии

Событие OutputDataReceived указывает, что связанная Process строка написала строку, завершающуюся новой линией (возврат каретки (CR), каналом строк (LF) или CR+LF) в перенаправленный StandardOutput поток.

Событие также возникает при достижении конца перенаправленного потока. В этом случае Data свойство обработчика DataReceivedEventArgs событий имеет значение null.

Событие включено во время асинхронных операций StandardOutputчтения. Чтобы запустить асинхронные операции чтения, необходимо перенаправить StandardOutput поток события Process, добавить обработчик событий в OutputDataReceived событие и вызвать BeginOutputReadLine. После этого событие сигнализирует каждый раз, OutputDataReceived когда процесс записывает строку в перенаправленный StandardOutput поток, пока процесс не завершится или не вызывается CancelOutputRead.

Note

Приложение, обрабатывающее асинхронные выходные данные, должно вызвать WaitForExit метод, чтобы убедиться, что выходной буфер был удален.

Применяется к

См. также раздел