Číst v angličtině

Sdílet prostřednictvím


DataReceivedEventHandler Delegát

Definice

Představuje metodu, která bude zpracovávat OutputDataReceived událost nebo ErrorDataReceived událost objektu Process.

public delegate void DataReceivedEventHandler(object sender, DataReceivedEventArgs e);

Parametry

sender
Object

Zdroj události

e
DataReceivedEventArgs

A DataReceivedEventArgs , který obsahuje data události.

Příklady

Následující příklad kódu ukazuje, jak provádět asynchronní operace čtení na přesměrovaný StandardOutput datový proud příkazu sort . Příkaz sort je konzolová aplikace, která čte a seřadí textový vstup.

Příklad vytvoří DataReceivedEventHandler delegáta pro obslužnou rutinu SortOutputHandler události a přidruží delegáta k OutputDataReceived události. Obslužná rutina události přijímá řádky textu z přesměrovaného StandardOutput datového proudu, formátuje text a zapisuje text na obrazovku.

// Define the namespaces used by this sample.
using System;
using System.Text;
using System.IO;
using System.Diagnostics;
using System.Threading;
using System.ComponentModel;

namespace ProcessAsyncStreamSamples
{
    class SortOutputRedirection
    {
        // Define static variables shared by class methods.
        private static StringBuilder sortOutput = null;
        private static int numOutputLines = 0;

        public static void SortInputListText()
        {
            // Initialize the process and its StartInfo properties.
            // The sort command is a console application that
            // reads and sorts text input.

            Process sortProcess = new Process();
            sortProcess.StartInfo.FileName = "Sort.exe";

            // Set UseShellExecute to false for redirection.
            sortProcess.StartInfo.UseShellExecute = false;

            // Redirect the standard output of the sort command.
            // This stream is read asynchronously using an event handler.
            sortProcess.StartInfo.RedirectStandardOutput = true;
            sortOutput = new StringBuilder();

            // Set our event handler to asynchronously read the sort output.
            sortProcess.OutputDataReceived += SortOutputHandler;

            // Redirect standard input as well.  This stream
            // is used synchronously.
            sortProcess.StartInfo.RedirectStandardInput = true;

            // Start the process.
            sortProcess.Start();

            // Use a stream writer to synchronously write the sort input.
            StreamWriter sortStreamWriter = sortProcess.StandardInput;

            // Start the asynchronous read of the sort output stream.
            sortProcess.BeginOutputReadLine();

            // Prompt the user for input text lines.  Write each
            // line to the redirected input stream of the sort command.
            Console.WriteLine("Ready to sort up to 50 lines of text");

            String inputText;
            int numInputLines = 0;
            do
            {
                Console.WriteLine("Enter a text line (or press the Enter key to stop):");

                inputText = Console.ReadLine();
                if (!String.IsNullOrEmpty(inputText))
                {
                    numInputLines++;
                    sortStreamWriter.WriteLine(inputText);
                }
            }
            while (!String.IsNullOrEmpty(inputText) && (numInputLines < 50));
            Console.WriteLine("<end of input stream>");
            Console.WriteLine();

            // End the input stream to the sort command.
            sortStreamWriter.Close();

            // Wait for the sort process to write the sorted text lines.
            sortProcess.WaitForExit();

            if (numOutputLines > 0)
            {
                // Write the formatted and sorted output to the console.
                Console.WriteLine($" Sort results = {numOutputLines} sorted text line(s) ");
                Console.WriteLine("----------");
                Console.WriteLine(sortOutput);
            }
            else
            {
                Console.WriteLine(" No input lines were sorted.");
            }

            sortProcess.Close();
        }

        private static void SortOutputHandler(object sendingProcess,
            DataReceivedEventArgs outLine)
        {
            // Collect the sort command output.
            if (!String.IsNullOrEmpty(outLine.Data))
            {
                numOutputLines++;

                // Add the text to the collected output.
                sortOutput.Append(Environment.NewLine +
                    $"[{numOutputLines}] - {outLine.Data}");
            }
        }
    }
}

namespace ProcessAsyncStreamSamples
{

    class ProcessSampleMain
    {
        /// The main entry point for the application.
        static void Main()
        {
            try
            {
                SortOutputRedirection.SortInputListText();
            }
            catch (InvalidOperationException e)
            {
                Console.WriteLine("Exception:");
                Console.WriteLine(e);
            }
        }
    }
}

Poznámky

Při vytváření delegáta DataReceivedEventHandler identifikujete metodu, která bude zpracovávat událost. Pokud chcete událost přidružit k obslužné rutině události, přidejte do události instanci delegáta. Obslužná rutina události je volána při každém výskytu události, dokud neodeberete delegáta. Další informace o delegátech obslužné rutiny událostí najdete v tématu Zpracování a vyvolávání událostí.

Pokud chcete asynchronně shromáždit přesměrovaný StandardOutput výstup nebo StandardError výstup streamu procesu, přidejte obslužnou rutinu OutputDataReceived události do události nebo ErrorDataReceived . Tyto události jsou vyvolány pokaždé, když proces zapíše řádek do odpovídajícího přesměrovaného datového proudu. Při zavření přesměrovaného datového proudu se do obslužné rutiny události odešle řádek s hodnotou null. Před přístupem k vlastnosti se ujistěte, že obslužná rutina události zkontroluje tuto podmínku Data . Můžete například použít metodu staticString.IsNullOrEmpty k ověření Data vlastnosti v obslužné rutině události.

Metody rozšíření

GetMethodInfo(Delegate)

Získá objekt, který představuje metodu reprezentovanou zadaným delegátem.

Platí pro

Viz také