dotnet/runtime

Console.In.Peek() always returning EOF after the first read line on Windows

开放

#40,735 创建于 2020年8月12日

 (4 条评论) (0 个反应) (0 位负责人)C# (5,445 个派生)batch import
area-System.Consolehelp wantedos-windows

仓库指标

星标
 (17,886 个星标)
PR 合并指标
 (平均合并 12天 11小时) (30 天内合并 661 个 PR)

描述

I came across the following behaviour when debugging a System.Console test. Running

static void Main()
{
    while (true)
    {
        Console.Write("Enter some text: ");
        int c = Console.In.Peek();
        string? line = Console.In.ReadLine();
        Console.WriteLine($"Peek: {c} ReadLine: {line}");
    }
}

Produces the following behaviour

Enter some text: test
Peek: 116 ReadLine: test
Enter some text: test
Peek: -1 ReadLine: test
Enter some text: test
Peek: -1 ReadLine: test

Essentially it is impossible to use Console.In.Peek() after the first line has been consumed. Note that this behaviour manifests itself regardless of whether the buffer contains any characters. The following variant will produce the exact same observable behaviour:

static void Main()
{
    while(true)
    {
        Console.Write("Enter some text: ");
        int c = MyPeek();
        string? line = Console.In.ReadLine();
        Console.WriteLine($"Peek: {c} ReadLine: {line}");
    }

    static int MyPeek()
    {
        while (!Console.KeyAvailable)
        {
            Thread.Sleep(10);
        }
        return Console.In.Peek();
    }
}

Note that unix does not have the same behaviour.

贡献者指南