2012-06-19 101 views
1

我有一個按鈕單擊事件處理程序與其中的開關案例,它控制一個事件處理程序中的多個按鈕。c#按鈕點擊排隊

我需要使用一個隊列,因爲當單擊一個按鈕並進行一些處理時,第二個按鈕的點擊不會干擾第一個按鈕的點擊,而是添加到隊列中。我不想使用.enabled=false;,因爲它會完全放棄第二次點擊,而且我目前正在編輯某人的軟件,所以我不想破壞我不知道的事情,那麼您的建議是什麼?

+0

如果事件處理程序在UI線程上運行,則這可能不是必需的。如果每個操作都在同一個線程上處理,那麼第一個操作將阻止所有後續點擊處理。 –

回答

0

我與System.Collections.Queue

的代碼是成功的:

當然
private Queue<Button> Button_Queue = new Queue<Button>(); 
private bool isProcessing = false; 

private void Button_Click((object sender, EventArgs e){ 

if(isProcessing){ 
    Button_Queue.Enqueue(this); 
} 
else 
{ 
    isProcessing = true; 

    // code here 

    isProcessing = false; 
    while(Button_Queue.Count > 0){ 
     Button_Queue.Dequeue().PerformClick(); 
    } 
} 

礦是從這個略有不同,因爲我需要通過一些變量和我的點擊方法修改這一點。

1

我認爲最好的想法是創建一個生產者/消費者隊列。

另一個question正在解釋這種技術。

基本上,這個想法是有一個工作線程,它將消耗一個隊列來完成工作,而其他線程通過在隊列中排隊操作產生工作。

+0

如何將它與button_click事件一起使用?我在工作線程方面沒有多少資格,因此任何示例都會很好。 –

+0

這裏可以是一個很好的起點:http://stackoverflow.com/a/5108487/588868。在Windows窗體應用程序中使用線程時遇到的挑戰是避免訪問不在UI線程中的控件屬性。你需要一堆anyControl.InvokeRequired和anyControl.Invoke來在UI線程中執行代碼。 –

+0

基本上,我在想像爲流程設置一個標誌(isProcessing = true/false),並在用戶單擊其中一個按鈕時檢查它,然後如果處理將此按鈕單擊事件添加到隊列中,則在非空時執行隊列。但我需要一種方法來排列button_click。或者將按鈕添加到隊列中,然後調用click事件。我會先嚐試一下。 –