zoukankan      html  css  js  c++  java
  • Process.StandardOutput

    Namespace:  System.Diagnostics
    Assembly:  System (in System.dll)

    Syntax

     
     
    [BrowsableAttribute(false)]
    public StreamReader StandardOutput { get; }
    

    Property Value

    Type: System.IO.StreamReader
    StreamReader that can be used to read the standard output stream of the application.

    Exceptions

     
    ExceptionCondition
    InvalidOperationException

    The StandardOutput stream has not been defined for redirection; ensure ProcessStartInfo.RedirectStandardOutput is set to trueand ProcessStartInfo.UseShellExecute is set to false.

    - or -

    The StandardOutput stream has been opened for asynchronous read operations with BeginOutputReadLine.

    Remarks

     

    When a Process writes text to its standard stream, that text is normally displayed on the console. By redirecting the StandardOutput stream, you can manipulate or suppress the output of a process. For example, you can filter the text, format it differently, or write the output to both the console and a designated log file.

    NoteNote

    To use StandardOutput, you must set ProcessStartInfo.UseShellExecute to false, and you must set ProcessStartInfo.RedirectStandardOutput to true. Otherwise, reading from the StandardOutput stream throws an exception.

    The redirected StandardOutput stream can be read synchronously or asynchronously. Methods such as ReadReadLine, and ReadToEnd perform synchronous read operations on the output stream of the process. These synchronous read operations do not complete until the associated Process writes to its StandardOutputstream, or closes the stream.

    In contrast, BeginOutputReadLine starts asynchronous read operations on the StandardOutput stream. This method enables a designated event handler for the stream output and immediately returns to the caller, which can perform other work while the stream output is directed to the event handler.

    Synchronous read operations introduce a dependency between the caller reading from the StandardOutput stream and the child process writing to that stream. These dependencies can result in deadlock conditions. When the caller reads from the redirected stream of a child process, it is dependent on the child. The caller waits on the read operation until the child writes to the stream or closes the stream. When the child process writes enough data to fill its redirected stream, it is dependent on the parent. The child process waits on the next write operation until the parent reads from the full stream or closes the stream. The deadlock condition results when the caller and child process wait on each other to complete an operation, and neither can proceed. You can avoid deadlocks by evaluating dependencies between the caller and child process.

    The following C# code, for example, shows how to read from a redirected stream and wait for the child process to exit.

     
     
     // Start the child process.
     Process p = new Process();
     // Redirect the output stream of the child process.
     p.StartInfo.UseShellExecute = false;
     p.StartInfo.RedirectStandardOutput = true;
     p.StartInfo.FileName = "Write500Lines.exe";
     p.Start();
     // Do not wait for the child process to exit before
     // reading to the end of its redirected stream.
     // p.WaitForExit();
     // Read the output stream first and then wait.
     string output = p.StandardOutput.ReadToEnd();
     p.WaitForExit();
    

    The code example avoids a deadlock condition by calling p.StandardOutput.ReadToEnd before p.WaitForExit. A deadlock condition can result if the parent process calls p.WaitForExit before p.StandardOutput.ReadToEnd and the child process writes enough text to fill the redirected stream. The parent process would wait indefinitely for the child process to exit. The child process would wait indefinitely for the parent to read from the full StandardOutput stream.

    There is a similar issue when you read all text from both the standard output and standard error streams. The following C# code, for example, performs a read operation on both streams.

     
     
     // Do not perform a synchronous read to the end of both 
     // redirected streams.
     // string output = p.StandardOutput.ReadToEnd();
     // string error = p.StandardError.ReadToEnd();
     // p.WaitForExit();
     // Use asynchronous read operations on at least one of the streams.
     p.BeginOutputReadLine();
     string error = p.StandardError.ReadToEnd();
     p.WaitForExit();
    

    The code example avoids the deadlock condition by performing asynchronous read operations on the StandardOutput stream. A deadlock condition results if the parent process calls p.StandardOutput.ReadToEnd followed by p.StandardError.ReadToEnd and the child process writes enough text to fill its error stream. The parent process would wait indefinitely for the child process to close its StandardOutput stream. The child process would wait indefinitely for the parent to read from the full StandardError stream.

    You can use asynchronous read operations to avoid these dependencies and their deadlock potential. Alternately, you can avoid the deadlock condition by creating two threads and reading the output of each stream on a separate thread.

    NoteNote

    You cannot mix asynchronous and synchronous read operations on a redirected stream. Once the redirected stream of a Process is opened in either asynchronous or synchronous mode, all further read operations on that stream must be in the same mode. For example, do not follow BeginOutputReadLinewith a call to ReadLine on the StandardOutput stream, or vice versa. However, you can read two different streams in different modes. For example, you can callBeginOutputReadLine and then call ReadLine for the StandardError stream.

    Examples

     

    The following example spawns a new user-defined executable and reads its standard output. The output is then displayed in the console.

     
    using System;
    using System.IO;
    using System.Diagnostics;
    
    class IORedirExample
    {
        public static void Main()
        {
            string[] args = Environment.GetCommandLineArgs();
            if (args.Length > 1)
            {
                // This is the code for the spawned process
                Console.WriteLine("Hello from the redirected process!");
            }
            else
            {
                // This is the code for the base process
                Process myProcess = new Process();
                // Start a new instance of this program but specify the 'spawned' version.
                ProcessStartInfo myProcessStartInfo = new ProcessStartInfo(args[0], "spawn");
                myProcessStartInfo.UseShellExecute = false;
                myProcessStartInfo.RedirectStandardOutput = true;
                myProcess.StartInfo = myProcessStartInfo;
                myProcess.Start();
                StreamReader myStreamReader = myProcess.StandardOutput;
                // Read the standard output of the spawned process. 
                string myString = myStreamReader.ReadLine();
                Console.WriteLine(myString);
    
                myProcess.WaitForExit();
                myProcess.Close();
            }
        }
    }
    

    Version Information

     

    .NET Framework

    Supported in: 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

    .NET Framework Client Profile

    Supported in: 4, 3.5 SP1

    .NET Framework Security

     
    • LinkDemand 

      for full trust for the immediate caller. This member cannot be used by partially trusted code.

    Platforms

     

    Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core Role not supported), Windows Server 2008 R2 (Server Core Role supported with SP1 or later; Itanium not supported)

    The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.

  • 相关阅读:
    修改root密码
    环境的搭建(四)--------samba服务
    16.统一异常处理(上)编写自定义处理函数
    15.集成限流功能到我们的服务中(花操作必看)
    14.go内置的rate包学习2(有花操作,必看)
    13.go内置的rate包学习1
    12.使用负载均衡的方式调用服务(随机方式)
    11.使用负载均衡的方式调用服务(轮询方式)
    10.根据命令行参数注册多个服务
    9.consul获取服务实例,调用测试
  • 原文地址:https://www.cnblogs.com/itelite/p/4063150.html
Copyright © 2011-2022 走看看