1

我有一个按钮单击事件处理程序,其中有一个开关盒,用于控制一个事件处理程序中的多个按钮。

我需要使用队列,因为当单击一个按钮并进行一些处理时,第二个按钮单击不会干扰第一个按钮单击,而是添加到队列中。我不想使用.enabled=false;,因为它会完全放弃第二次点击,而且我目前正在编辑某人的工作软件,所以我不想破坏我不知道的东西,所以你有什么建议?

4

3 回答 3

1

我认为最好的办法是创建一个生产者/消费者队列。

另一个问题是解释这种技术。

基本上,这个想法是有一个工作线程将消耗一个队列来完成工作,而其他线程通过在队列中排队操作来产生工作。

于 2012-06-19T07:34:35.663 回答
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();
    }
}

当然我的与此略有不同,因为我需要传递一些变量并且为此修改了我的点击方法。

于 2012-06-19T10:27:46.970 回答
0

肮脏但简单的解决方案。

public partial class DataRefresh : Form //DataRefresh is just "some form"   
   {
      ...
      ...
        
      public DateTime ClickTime; //Time when click is processed by system  
      public DateTime LastExecutionRunTime = DateTime.MinValue; //Time when the all the click code finish
        
      private void buttonDataRefresh_Click(object sender, EventArgs e)
         {
            ClickTime = DateTime.Now;
            if (ClickTime.Subtract(LastExecutionRunTime).TotalSeconds < 5 ) 
            {
               //It will keep returning - hopefully until all events in que are satisfied  
               return;
            }

            //Long running code
            //Importing whole table from remote DB
            ...
            ...
            //End of the Long running code 
            
            LastExecutionRunTime = DateTime.Now;
         }
   }
于 2021-09-07T17:47:55.720 回答