dotnet/runtime
Voir sur GitHubConsole.In.Peek() always returning EOF after the first read line on Windows
Open
#40 735 ouverte le 12 août 2020
area-System.Consolehelp wantedos-windows
Métriques du dépôt
- Stars
- (17 886 stars)
- Métriques de merge PR
- (Merge moyen 12j 11h) (661 PRs mergées en 30 j)
Description
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.