Process.OutputDataReceived 事件   
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
每次应用程序向其重定向 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 namespace System;
using namespace System::IO;
using namespace System::Diagnostics;
using namespace System::Text;
ref class StandardAsyncOutputExample
{
private:
    static int lineCount = 0;
    static StringBuilder^ output = nullptr;
public:
    static void Run()
    {
        Process^ process = gcnew Process();
        process->StartInfo->FileName = "ipconfig.exe";
        process->StartInfo->UseShellExecute = false;
        process->StartInfo->RedirectStandardOutput = true;
        output = gcnew StringBuilder();
        process->OutputDataReceived += gcnew DataReceivedEventHandler(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();
        // 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();
    }
private:
    static void OutputHandler(Object^ sender, DataReceivedEventArgs^ e)
    {
        // Prepend line numbers to each line of the output.
        if (!String::IsNullOrEmpty(e->Data))
        {
            lineCount++;
            output->Append("\n[" + lineCount + "]: " + e->Data);
        }
    }
};
int main()
{
    StandardAsyncOutputExample::Run();
}
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();
    }
}
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 的流。
在 上的 StandardOutput异步读取操作期间启用 事件。 若要启动异步读取操作,必须重定向 StandardOutput 的 Process流,将事件处理程序添加到 OutputDataReceived 事件,然后调用 BeginOutputReadLine。 此后, OutputDataReceived 每次进程将行写入重定向 StandardOutput 流时,事件都会发出信号,直到进程退出或调用 CancelOutputRead。
注意
正在处理异步输出的应用程序应调用 WaitForExit 方法,以确保已刷新输出缓冲区。