DataReceivedEventArgs Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет данные для событий OutputDataReceived и ErrorDataReceived .
public ref class DataReceivedEventArgs : EventArgs
public class DataReceivedEventArgs : EventArgs
type DataReceivedEventArgs = class
inherit EventArgs
Public Class DataReceivedEventArgs
Inherits EventArgs
- Наследование
Примеры
В следующем примере кода показано, как выполнять асинхронные операции чтения в перенаправленном StandardOutput потоке sort
команды. Команда sort
— это консольное приложение, которое считывает и сортирует введенный текст.
В примере создается делегат события для обработчика SortOutputHandler
событий и он связывается с событием OutputDataReceived . Обработчик событий получает текстовые строки из перенаправленного StandardOutput потока, форматирует текст и записывает его на экран.
// Define the namespaces used by this sample.
#using <System.dll>
using namespace System;
using namespace System::Text;
using namespace System::IO;
using namespace System::Diagnostics;
using namespace System::Threading;
using namespace System::ComponentModel;
ref class SortOutputRedirection
{
private:
// Define static variables shared by class methods.
static StringBuilder^ sortOutput = nullptr;
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;
sortProcess = gcnew 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 = gcnew StringBuilder;
// Set our event handler to asynchronously read the sort output.
sortProcess->OutputDataReceived += gcnew DataReceivedEventHandler( 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 = {0} sorted text line(s) ",
numOutputLines.ToString() );
Console::WriteLine( "----------" );
Console::WriteLine( sortOutput->ToString() );
}
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->AppendFormat( "\n[{0}] {1}",
numOutputLines.ToString(), outLine->Data );
}
}
};
/// The main entry point for the application.
void main()
{
try
{
SortOutputRedirection::SortInputListText();
}
catch ( InvalidOperationException^ e )
{
Console::WriteLine( "Exception:" );
Console::WriteLine( e );
}
}
// 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);
}
}
}
}
' Define the namespaces used by this sample.
Imports System.Text
Imports System.IO
Imports System.Diagnostics
Imports System.Threading
Imports System.ComponentModel
Namespace ProcessAsyncStreamSamples
Class ProcessAsyncOutputRedirection
' Define static variables shared by class methods.
Private Shared sortOutput As StringBuilder = Nothing
Private Shared numOutputLines As Integer = 0
Public Shared Sub SortInputListText()
' Initialize the process and its StartInfo properties.
' The sort command is a console application that
' reads and sorts text input.
Dim sortProcess As 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.
' Read the stream asynchronously using an event handler.
sortProcess.StartInfo.RedirectStandardOutput = True
sortOutput = New StringBuilder()
' Set our event handler to asynchronously read the sort output.
AddHandler sortProcess.OutputDataReceived, AddressOf 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.
Dim sortStreamWriter As StreamWriter = 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")
Dim inputText As String
Dim numInputLines As Integer = 0
Do
Console.WriteLine("Enter a text line (or press the Enter key to stop):")
inputText = Console.ReadLine()
If Not String.IsNullOrEmpty(inputText) Then
numInputLines += 1
sortStreamWriter.WriteLine(inputText)
End If
Loop While Not String.IsNullOrEmpty(inputText) AndAlso 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 Not String.IsNullOrEmpty(numOutputLines) Then
' 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.")
End If
sortProcess.Close()
End Sub
Private Shared Sub SortOutputHandler(sendingProcess As Object,
outLine As DataReceivedEventArgs)
' Collect the sort command output.
If Not String.IsNullOrEmpty(outLine.Data) Then
numOutputLines += 1
' Add the text to the collected output.
sortOutput.Append(Environment.NewLine +
$"[{numOutputLines}] - {outLine.Data}")
End If
End Sub
End Class
End Namespace
Namespace ProcessAsyncStreamSamples
Class ProcessSampleMain
' The main entry point for the application.
Shared Sub Main()
Try
ProcessAsyncOutputRedirection.SortInputListText()
Catch e As InvalidOperationException
Console.WriteLine("Exception:")
Console.WriteLine(e)
End Try
End Sub
End Class 'ProcessSampleMain
End Namespace 'Process_AsyncStream_Sample
Комментарии
Чтобы асинхронно собирать перенаправленные StandardOutput или StandardError потоковые выходные данные процесса, необходимо создать метод, который обрабатывает события перенаправленного вывода потока. Метод обработчика событий вызывается, когда процесс записывает данные в перенаправленный поток. Делегат события вызывает обработчик событий с экземпляром DataReceivedEventArgs. Свойство Data содержит текстовую строку, которую процесс записал в перенаправленный поток.
Свойства
Data |
Возвращает строку символов, записанную в перенаправленный поток вывода Process. |
Методы
Equals(Object) |
Определяет, равен ли указанный объект текущему объекту. (Унаследовано от Object) |
GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
GetType() |
Возвращает объект Type для текущего экземпляра. (Унаследовано от Object) |
MemberwiseClone() |
Создает неполную копию текущего объекта Object. (Унаследовано от Object) |
ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |