У меня недавно была такая же проблема, и я решил опубликовать свое объяснение:
Пока выполняется длинное задание, пользователь нажимает на кнопку несколько раз.Windows отправляет эти сообщения приложению, однако приложение не может обработать их немедленно, поскольку в данный момент оно занято.Поэтому сообщения ожидают в очереди, чтобы приложение стало доступным.Когда приложение завершает выполнение задачи, для свойства кнопки Enabled сразу устанавливается значение True, и в следующий раз оно получает сообщения в очереди.В этот момент кнопка включена, поэтому приложение обрабатывает новые щелчки, как если бы кнопка никогда не была отключена.
Исправить предложение:
Вы можете вставить строку «Application.DoEvents ()» простоперед строкой "button1.Enabled = true;"Таким образом, поставленные в очередь сообщения будут достигать кнопки, пока она все еще отключена, и теперь кнопка будет отбрасывать их.
Отказ от ответственности: Кажется, использование Application.DoEvents () не считается хорошей практикой.Однако это хорошо показывает, что происходит в данном конкретном случае.
Я думаю, что решение, предложенное Rhapsody, лучше, чем использование Application.DoEvents ().С помощью BackgroundWorker мы создаем второй поток и поэтому не блокируем поток с графическим интерфейсом.Поскольку GUI остается отзывчивым, отключение кнопки будет работать, как и ожидалось.