Warum behandelt .NET Core ReadKey auf Raspbian anders?

8

Ich schreibe eine .NET Core-Konsolenanwendung. Ich wollte die Konsoleneingabe auf eine bestimmte Anzahl von Maximalzeichen für jeden Eingang beschränken. Ich habe etwas Code, der dies tut, indem er eine Zeichenkette mit Console.ReadKey() anstelle von Console.ReadLine() erstellt. Alles hat perfekt funktioniert und es unter Windows getestet. Als ich dann auf einem Raspberry Pi 3 mit Raspbian entfaltete, stieß ich schnell auf alle möglichen Probleme. Ich erinnerte mich, dass Linux Zeilenenden anders als Windows behandelt, und es scheint, Backspaces werden auch anders behandelt. Ich habe die Art und Weise geändert, wie ich diese gehandhabt habe, indem ich den ConsoleKey anstelle des Zeichens ausgeschaltet habe, und das Newline-Problem ist verschwunden, aber Backspaces werden nur manchmal registriert. Manchmal werden Zeichen auch außerhalb meines Eingabefelds an die Konsole ausgegeben, obwohl ich den ReadKey so eingestellt habe, dass er nicht selbst auf die Konsole ausgegeben wird. Fehle ich etwas darüber, wie Linux Konsoleneingaben handhabt?

%Vor%     
tyjkenn 09.10.2017, 21:52
quelle

2 Antworten

2

Ich denke, das grundlegende Problem wird von Stephen Toubs Kommentar in diesem GitHub-Problem aufgedeckt:

  

Sie denken vielleicht an die Tatsache, dass wir das Echo jetzt nur während eines ReadKey (intercept: true) -Aufrufs deaktivieren. In einem Wettlauf zwischen dem Benutzer und dem Aufruf von ReadKey (intercept: true) könnte der Schlüssel Echo sein. Selbst wenn du gehofft hast, es wäre nicht, aber du wirst den Tastenanschlag nicht verlieren.

Was ist kalt Komfort, aber genau. Dies ist ein Rennen, das sehr schwer zu gewinnen ist. Das Kernproblem ist, dass ein Linux-Terminal anders als die Windows-Konsole funktioniert. Es funktioniert viel mehr wie ein Fernschreiber in den 1970er Jahren. Du hast auf der Tastatur herumgeknallt, egal, ob der Computer dem, was du tippst, irgendwelche Aufmerksamkeit schenkte, der Fernschreiber gab nur wieder, was du tipptest, wenn du ihn auf Papier fällst. Bis Sie die Eingabetaste drücken, begann der Computer, den Text abzudrehen.

Ganz anders als die Windows-Konsole, erfordert das Programm einen aktiven Leseaufruf, um jeden getippten Text zu wiederholen.

Das ist also ein grundlegender Unterschied zu der Konsolen-API. Es benötigt eine Echo -Eigenschaft, um Ihnen Hoffnung zu geben, dies richtig zu machen. Sie können also false festlegen, bevor Sie mit der Annahme von Eingaben beginnen und sich selbst um das Echo kümmern. Es ist immer noch ein Wettrennen, aber zumindest hast du eine Chance, jeden vorformulierten Text zu löschen.

Die einzige halbwegs annehmbare Lösung, die Sie jetzt haben, ist Deaktivieren Sie das Echo , bevor Sie Ihr Programm starten. Sie müssen alle Eingaben mit Ihrer Methode machen.

    
Hans Passant 17.10.2017, 23:13
quelle
2

Ich habe getestet und festgestellt, dass Console.ReadKey(true) tatsächlich einige Fehler hat, bei denen der Schlüssel tatsächlich in die Konsole zurückübertragen wird, wenn die Eingabe schnell ist oder Wiederholungsschlüssel ausgelöst werden. Das ist etwas, was Sie nicht erwarten, aber warum es passiert, habe ich keine Ahnung.

Wenn Sie daran interessiert sind, es zu debuggen, können Sie den folgenden Quellcode ansehen

Ссылка

Ich habe eine Problemumgehung für das Problem erstellt. Es gibt also wenige Probleme in Ihrem Ansatz. Die Schlüssel Left Arrow und Right Arrow sollten behandelt werden oder sie sollten nicht erlaubt sein. Ich wählte das spätere, indem ich den folgenden Code hinzufügte:

%Vor%

Wenn Sie die Zeichen mit

eingeben %Vor%

Sie stören grundsätzlich auch die Cursorposition, was nicht korrekt ist. Sie müssen also die Cursorposition mit

festlegen %Vor%

Jetzt kommt der Teil der Behandlung der undichten Schlüssel, der wahrscheinlich ein .NET-Bug ist, den ich unten Code hinzugefügt habe

%Vor%

Also prüfen wir aus irgendeinem unsichtbaren Grund, ob etwas widerhallt wurde und löschen es dann. Dann testete es Stress

%Vor%

Unten ist der letzte Code, den ich benutzt habe

%Vor%     
Tarun Lalwani 14.10.2017 13:29
quelle