RINCODE
@RINCODE
Я новичок, еще учусь

Как ожидать нажатия клавиши без заморозки основного потока?

Все привет, у меня есть такой код
public static void GetStart()
        {
            while (true)
            {
                if (Keyboard.IsKeyDown(Key.O))
                {
                    botWork = true;
                    MessageBox.Show($"botWork: {botWork}");
                }

                else if (Keyboard.IsKeyDown(Key.P))
                {
                    botWork = false;
                    MessageBox.Show($"botWork: {botWork}");
                }

                if (botWork  && counter == 0)
                {
                    MessageBox.Show($"start: {botWork}");
                    //Thread threadCheckTrables = new Thread(CheckTrables);
                    Thread threadCastFishingRod = new Thread(CastFishingRod);
                    threadCastFishingRod.Start();
                }
            }
        }

Он вызывается из Menu.xaml.cs и все зависает, это из-за того, что работает в том же потоке, что и основная программа, но если попытаться перевести в другой поток, то получается вот это
System.InvalidOperationException: "Вызывающим потоком должен быть STA, поскольку этого требуют большинство компонентов UI."

Помогите пожалуйста решить проблему)
  • Вопрос задан
  • 154 просмотра
Решения вопроса 1
VoidVolker
@VoidVolker Куратор тега C#
Dark side eye. А у нас печеньки! А у вас?
Во-первых - для работы с хоткеями используйте соответствующие события, а не проверку нажата ли или нет клавиша. ОС предоставляет для этого специальные API и оно уже реализовано на уровне приложения. Проверка в цикле "нажата ли клавиша" просто тупо будет грузить процессор на 100% и 99.999% времени эта проверка бесполезна, при этом ОС уведомит приложении о клавише отдельным сообщением. Если надо глобальные хоткеи на уровне приложения - это делается через добавление кода в проверку системных сообщений окну и создание события, на которое уже вешается свой обработчик и какие-то там действия в приложении. Если надо хоткей на уровне системы - то тут надо использовать хук.
Второе - это ошибка, поиск в гугле которой, стразу же приведет вас к решению и объяснению, почему так. Кроме того, она же на русском даже.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы