Skip to content

StreamReader over standard input stream does not echo if Console.ReadLine has been run first #39008

Closed
@mjcheetham

Description

@mjcheetham

Description

When targeting .NET Core 3.x (netcoreapp3.0 and netcoreapp3.1), a call to StreamReader::ReadLine with the standard input Stream as the underlying stream does not 'echo' typed characters at the terminal on macOS/Linux IF a call to Console.ReadLine has been made before.

This issue does not occur when targetting netcoreapp2.1; both Console.ReadLine and StreamReader::ReadLine echo typed characters.

using System;
using System.IO;

class Program
{
    // Only repros in .NET Core 3.1
    static void Main(string[] args)
    {
        // Comment this line out and echo with StreamReader:ReadLine works
        string consoleText = Console.ReadLine();

        var stdin = Console.OpenStandardInput();
        using (var sr = new StreamReader(stdin))
        {
            // Does not echo if the Console.ReadLine call has been executed
            string readerText = sr.ReadLine();
        }
    }
}
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <!-- Does not repro if you target .NET Core 2.1 -->
    <!--<TargetFramework>netcoreapp2.1</TargetFramework>-->
  </PropertyGroup>
</Project>
$ dotnet run
hello<return>                               # Console.ReadLine
<typed characters here do not echo><return> # StreamReader.ReadLine
<program exit>

Configuration

OSs

  • Ubuntu 20.04 LTS x86_64
  • macOS 10.15 Catalina x86_64

Target Frameworks

  • netcoreapp3.0
  • netcoreapp3.1

Installed SDK
3.1.301

Regression?

Yes. When targeting .NET Core 2.1 this does not repro.

Other information

I know there have been many issues in this space over in prior releases in order to support ReadKey(intercept: true) on *nix systems. I imagine there's a problem in the initialisation of the console and terminal options for echo since this only happens if you interact with the console and standard input stream via Console.ReadLine before.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions