多个线程向ListBox添加和删除项目

时间:2011-11-23 12:34:32

标签: c# .net winforms multithreading

我有以下代码在其他应用程序中正常工作。

在我的应用程序中,我有4个线程每60ms调用一次AddToList方法。

一旦列表中有1000个项目并开始尝试删除项目,CPU将达到100%。将计数设置为100会修复它。

任何想法为什么?

以下是代码:

public delegate void dgAddToList(string Message, int InputID);

public void AddToList(string Message, int InputID)
{
   if (this.InvokeRequired)
   {
      this.BeginInvoke(new dgAddToList(AddToList), new object[] { Message, InputID });
   }
   else
   {

      switch (InputID)
      {
         case 0:
            this.listBox1.Items.Insert(0, Message);

            if (this.listBox1.Items.Count > 100) 
            this.listBox1.Items.RemoveAt(this.listBox1.Items.Count - 1);

            break;

         case 1:
             this.listBox2.Items.Insert(0, Message);

             if (this.listBox2.Items.Count > 100) 
                this.listBox2.Items.RemoveAt(this.listBox2.Items.Count - 1);

             break;

          case 2:
              this.listBox3.Items.Insert(0, Message);

              if (this.listBox3.Items.Count > 100) 
                this.listBox3.Items.RemoveAt(this.listBox3.Items.Count - 1);

               break;

           case 3:
              this.listBox4.Items.Insert(0, Message);

              if (this.listBox4.Items.Count > 100) 
                 this.listBox4.Items.RemoveAt(this.listBox4.Items.Count - 1);

               break;
     }
}

}

更新:只是为了澄清。第一个线程只更新Listbox1,第二个线程将更新Listbox 2.这由InputID参数决定,因此Thread1传递0而线程2传递1

1 个答案:

答案 0 :(得分:1)

我相信60毫秒和4个异步线程是UI消息管道的一大负载,因此它被卡住了。如果从应用程序行为要求角度来看这是合适的,请尝试增加时间间隔(例如200毫秒)。

顺便说一句,你可以如下所示refcator switch语句,所以代码会很清楚:

public void AddToList(string Message, int InputID)
{
    if (this.InvokeRequired)
    {
        this.BeginInvoke(new dgAddToList(AddToList), new object[] { Message, InputID });
    }
    else
    {
        ListBox listBoxInstance = null;

        switch (InputID)
        {
            case 0:
                listBoxInstance = this.listBox1;
                break;
            case 1:
                listBoxInstance = this.listBox2;
                break;
            case 2:
                listBoxInstance = this.listBox3;
                break;
            case 3:
                listBoxInstance = this.listBox4;
                break;
        }

        if (listBoxInstance != null)
        {
             listBoxInstance.Items.Insert(0, Message);
             if (listBoxInstance.Items.Count > 100)
             {
                listBoxInstance.Items.RemoveAt(
                                  listBoxInstance.Items.Count - 1);
             }
        }
    }
}