Skip to content

Console.ReadLine() returns each line one Enter late when Console.TreatControlCAsInput is true on Windows #133814

Description

@caraioniurie47

Description

With Console.TreatControlCAsInput = true on Windows, Console.ReadLine() does not return when Enter is pressed. It returns when the next line is entered, and what it returns is the previous line. An app reading lines in that mode is always one line behind the user.

The setter clears ENABLE_PROCESSED_INPUT and nothing else (src/libraries/System.Console/src/System/ConsolePal.Windows.cs:475-482). With that flag clear, the console host delivers Enter as a bare \r: calling ReadConsoleW directly on the input handle, a line comes back ending in \r, where the default mode gives \r\n. Console.ReadLine() calls Console.In.ReadLine(), and Console.In on Windows wraps a StreamReader over the console stream (ConsolePal.Windows.cs:179-189), and StreamReader.ReadLine, having found \r, calls ReadBuffer() to see whether a \n follows (src/libraries/System.Private.CoreLib/src/System/IO/StreamReader.cs:860-863). On a console that read waits for the next line. The bare \r is measured; that the look-ahead is what waits comes from reading the source. In the same mode Console.Read() hands back the \r without waiting for another line, which points at the look-ahead rather than at the host.

Found while re-testing #44667, which is about the same property.

Reproduction Steps

Console.TreatControlCAsInput = true;

while (true)
{
    string? line = Console.ReadLine();
    Console.WriteLine($"ReadLine returned: \"{line}\"");
}

A net10.0 console app with implicit usings. Run it in a console window, type one and Enter, two and Enter, three and Enter.

Expected behavior

Each ReadLine() returns on its own Enter, as it does with the first line commented out:

typed printed after that Enter
one + Enter ReadLine returned: "one"
two + Enter ReadLine returned: "two"
three + Enter ReadLine returned: "three"

Actual behavior

typed printed after that Enter
one + Enter nothing
two + Enter ReadLine returned: "one"
three + Enter ReadLine returned: "two"

The console screen buffer after three + Enter:

ReadLine returned: "one"
ReadLine returned: "two"

The typed text is not on screen either: the echoed Enter returns the cursor to column 0 of the same row without moving to a new one, so the next output overwrites it.

Regression?

No. The same lag, measured with a probe that reads three lines the same way, on .NET Core 3.1.4 and .NET Framework 4.8.

Known Workarounds

None tested.

Configuration

Windows 11 build 26200, x64, .NET 10.0.12, inbox conhost.exe. Also measured under a standalone OpenConsole.exe from Windows Terminal v1.0.1401.0 (2020), with the same result. Not run on Linux or macOS.

Other information

A related Windows-only quirk of the same reader is #40735 (Console.In.Peek() returning -1 after the first line).

I have not built a fix. Searching issues for ReadLine TreatControlCAsInput, ReadLine ENABLE_PROCESSED_INPUT, Console.ReadLine enter twice and ReadLine previous line console found no earlier report.

I'd like to work on fixing this, including working out where the fix belongs, and would appreciate being assigned.

Note

AI-generated, written at my direction and reviewed by me before posting. Source read at d84e42c1ca2. The reproduction program above was built and run as written on .NET 10.0.12, Windows 11 build 26200, under inbox conhost and under OpenConsole.exe 1.0.200517002, with the keystrokes written into its console input from a separate process (AttachConsole + WriteConsoleInput) and the screen buffer read back from there. It was also run by hand under inbox conhost, typed on a keyboard, with the same result. The ReadConsoleW and Console.Read() results, and the .NET Core 3.1.4 and .NET Framework 4.8 results, come from a separate harness that writes keystrokes into its own console input.

Recording.2026-09-13.111747.mp4

Activity

  1. dotnet-policy-service commented on Sep 13, 2026

    @dotnet-policy-service
    Contributor

    Tagging subscribers to this area: @dotnet/area-system-console
    See info in area-owners.md if you want to be subscribed.

  2. added this to the Future milestone on Sep 14, 2026
  3. added and removed
    untriagedNew issue has not been triaged by the area owner
    on Sep 14, 2026
  4. adamsitnik commented on Sep 14, 2026

    @adamsitnik
    Member

    Hi @caraioniurie47

    Thank you for a detailed bug report. Would you like to send a PR with a fix?

  5. added
    help wanted[up-for-grabs] Good issue for external contributors
    on Sep 14, 2026
  6. caraioniurie47 commented on Sep 14, 2026

    @caraioniurie47
    ContributorAuthor

    Hi @caraioniurie47

    Thank you for a detailed bug report. Would you like to send a PR with a fix?

    Yes, I'd like to. Could this be assigned to me? Thanks.

  7. removed
    help wanted[up-for-grabs] Good issue for external contributors
    on Sep 14, 2026
  8. adamsitnik commented on Sep 14, 2026

    @adamsitnik
    Member

    Hi @caraioniurie47
    Thank you for a detailed bug report. Would you like to send a PR with a fix?

    Yes, I'd like to. Could this be assigned to me? Thanks.

    Done, please let me know if you need any help.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Type

No type

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions