C# Console.ReadKey 1 символьная задержка?
Я пытаюсь работать с функцией Console.ReadKey(), чтобы перехватывать нажатия клавиш пользователя и перестраивать то, что они печатают на экране (так как мне нужно будет часто очищать экран, часто перемещать курсор, и это казалось как самый полный метод доказательства того, что напечатанные символы не исчезают и не появляются в случайных точках по всему экрану.
Мой вопрос: кто-нибудь еще испытывал "запаздывание" в 1 символ из-за отсутствия лучшего термина, когда делал что-то подобное? Скажем, я хочу набрать слово "Это". Когда я нажимаю "T", ничего не появляется, независимо от того, как долго я жду. Когда я нажимаю "h", появляется "T". "я", появляется "ч". Вводимая мной буква не появится, пока я не нажму другую клавишу, даже если эта клавиша - пробел. У кого-нибудь есть предложения по поводу того, что я делаю не так? Я уверен, что это связано с тем, как я использую Console.Readkey, я просто не вижу, какая альтернатива будет работать. Я приложил небольшой и простой пример этого ниже.
Спасибо!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApplication2
{
class Program
{
private static string userInput = "";
static ConsoleKeyInfo inf;
static StringBuilder input = new StringBuilder();
static void Main(string[] args)
{
Thread tickThread = new Thread(new ThreadStart(DrawScreen));
Thread userThread = new Thread(new ThreadStart(UserEventHandler));
tickThread.Start();
Thread.Sleep(1);
userThread.Start();
Thread.Sleep(20000);
tickThread.Abort();
userThread.Abort();
}
private static void DrawScreen()
{
while (true)
{
Console.Clear();
Console.SetCursorPosition(0, 0);
Console.Write("> " + userInput);
Thread.Sleep(300);
}
}
private static void UserEventHandler()
{
inf = Console.ReadKey(true);
while (true)
{
if (inf.Key != ConsoleKey.Enter)
input.Append(inf.KeyChar);
else
{
input = new StringBuilder();
userInput = "";
}
inf = Console.ReadKey(true);
userInput = input.ToString();
}
}
}
}
1 ответ
Это потому, что у вас есть 2 раза Console.ReadKey()
Если вы измените свой код в этом
private static void UserEventHandler()
{
while (true)
{
inf = Console.ReadKey(true);
if (inf.Key != ConsoleKey.Enter)
input.Append(inf.KeyChar);
else
{
input = new StringBuilder();
userInput = "";
}
userInput = input.ToString();
}
}
Это не лагает. второй Console.ReadKey()
блокирует в вашем коде. Я не проверял, нужен ли вам параметр true
на readkey, это для вас, чтобы узнать