[英]Strange issue when disabling a button
我有一個WinForm,其中包含一個按鈕。 在按鈕的click事件中,我將其稱為button1.Enabled = false
,然后跟隨許多代碼行。 在這段代碼之后,我調用button1.Enabled = true
。
這樣做是為了在執行過程中不能按下按鈕。 奇怪的是,當禁用按鈕時,如果用戶多次單擊按鈕,則實際上是單擊了按鈕。
誰能解釋為什么會這樣? 代碼如下:
button1.Enabled = false
//Code
//Code
//Code
button1.Enabled = true
我的猜測是,您實際上在這些代碼行中進行了大量工作,從而阻塞了UI線程。 您不應該這樣做-應該將按鈕設置為禁用,然后在后台線程中開始工作(或者,如果大部分時間都花在與Web服務或類似的事情上的話,則使用異步調用)。 然后,當工作完成時,應將調用編組到UI線程中以重新啟用按鈕。
(如果那不是問題,請顯示一個簡短但完整的程序來演示問題。)
編輯:感謝Sarwar的評論,我理解為什么您要觸發多個事件-它們正在排隊(由於UI線程被阻塞),並且僅在重新啟用按鈕后才進行處理。 因此,是的,如果您避免在UI線程上做很多工作,它可以處理對禁用按鈕的單擊,將其忽略,然后在重新啟用該按鈕時就不會積壓。
編輯:對於有興趣自己嘗試此操作的任何人,這是我的測試程序演示了這個問題:
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");
}
我在重新啟用按鈕之前使用Application.DoEvents()清空了隊列,以解決此問題
AppButton.Enabled = false;
...
do some work
...
Application.DoEvents();
AppButton.Enable = true;
我們遇到了同樣的問題,就像喬恩提到的那樣,這是因為UI被我們在click事件中所做的工作所阻塞。 恢復用戶界面后,它將注冊阻止用戶界面時發生的所有點擊。
這是Stack Overflow的另一個答案,其中提供了一些代碼來顯示如何解決問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.