Я думаю, что вы на самом деле делаете нагрузку работы в этих строках коды, блокируя поток пользовательского интерфейса. Вы не должны этого делать - вы должны отключить кнопку, а затем начать работу в фоновом потоке (или использовать асинхронные вызовы, если большую часть времени тратится на веб-службу или что-то подобное). Затем, когда работа закончена, она должна перевести вызов обратно в поток пользовательского интерфейса, чтобы снова включить кнопку.
(Если это не проблема, пожалуйста, покажите короткую, но полную программу, которая демонстрирует проблему.)
EDIT: Благодаря комментариям Сарвар, я понимаю, почему вы получаете многочисленные события увольняют - они помещаются в очередь (из-за блокировки потока пользовательского интерфейса) и обрабатываются только после повторной активации кнопки. Так что да, если вы избегаете много работы с потоком пользовательского интерфейса, он может обрабатывать клики на отключенной кнопке, игнорировать их, а затем при повторном включении кнопки не будет отставания.
EDIT: Для тех, кто заинтересован в попытке это сами, вот моя тестовая программа демонстрирует эту проблему:
using System;
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks; // For the fix below
class Program
{
static void Main()
{
Button button = new Button { Text = "Click me" };
button.Click += HandleClick;
Form form = new Form { Controls = { button } };
Application.Run(form);
}
static void HandleClick(object sender, EventArgs e)
{
Console.WriteLine("In click handler");
Button button = (Button) sender;
button.Enabled = false;
Thread.Sleep(10000);
button.Enabled = true;
Console.WriteLine("Finishing click handler");
}
}
И исправление с помощью C# 5 в обращение асинхронной:
static async void HandleClick(object sender, EventArgs e)
{
Console.WriteLine("In click handler");
Button button = (Button) sender;
button.Enabled = false;
// Delay by 10 seconds, but without blocking the UI thread
await TaskEx.Delay(10000);
button.Enabled = true;
Console.WriteLine("Finishing click handler");
}
ли это на самом деле появляется как отключенные после установки Enabled = ложь? – Shai
Возможный дубликат [как заблокировать приложение GUI в C# Winform] (http://stackoverflow.com/questions/6423606/how-to-lock-the-application-gui-in-c-sharp-winform) –