Да, действительно, ваша теория проблемы согласуется с теорией, предложенной мной и madmik3 в обмене комментариями выше.Объем работы, выполняемой вашим приложением в потоке пользовательского интерфейса, эффективно блокирует его от обработки других событий, включая нажатия клавиш пользователем.Они ставятся в очередь для последующего выполнения всякий раз, когда ваше приложение завершает свою трудоемкую задачу переднего плана.Это опасности современной многозадачной ОС с упреждением.Конечно, без публикации вашего реального кода лучшее, что я или кто-либо еще могу сделать, - это рассуждать о том, в чем заключается проблема, учитывая наш опыт.
Быстрая проверка, подтверждающая, что это действительно так, - это бросить Application.DoEvents
в ваш цикл обработки.Это позволит ОС немедленно обрабатывать нажатия клавиш, что приведет к сбою, потому что кнопка была отключена.(События Click
, инициируемые с помощью сочетания клавиш или мыши, не генерируются для элемента управления Button
, у которого для свойства Enabled
установлено значение "Ложь".) Это самое близкое к чему-либо подобное "промывка буферов ".Я сомневаюсь, что вы все равно получаете события KeyDown
или KeyPress
до тех пор, пока не будет выполнено какое-либо долгосрочное задание.
Если это решит проблему, долгосрочное решение - создать новый поток и выполнитькакую бы обработку вы ни делали там, а не в своем потоке пользовательского интерфейса.Это предотвратит блокировку вашего потока пользовательского интерфейса и, при условии, что элемент управления Button
правильно отключен, приведет к тому, что нажатия клавиш будут сброшены, потому что кнопка, которую они «нажимают», находится в состоянии, в котором нельзя нажать.Самый простой способ создать новый поток - использовать компонент BackgroundWorker
.Документация содержит довольно хороший пример.