簡體   English   中英

禁用按鈕時出現奇怪的問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM