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, это для вас, чтобы узнать

Другие вопросы по тегам