2011-11-23 69 views
3

我有下面的代码,在其他应用程序中正常工作。多个线程添加和删除项目到列表框

在我的应用程序中,我有4个线程每60毫秒调用一次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; 
    } 
} 

}

UPDATE:只是为了澄清。第一个线程只会更新Listbox1,第二个线程会更新Listbox 2.这是由InputID参数决定的,所以Thread1传递0和Thread 2传递1

+0

你是说,你叫从多个线程的代码?该代码不是线程安全的,首先检查计数,然后调用remove(另一个线程可能同时添加/删除了某些内容)?但这不是性能问题的根源。 –

+0

@Anders Invoke将其序列化。线程安全不是问题。 –

+0

这听起来像你可能会更好地与虚拟模式下运行的列表框(或列表视图),但是这是在WinForms中实现的。 –

回答

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); 
      } 
     } 
    } 
} 
+0

谢谢。我无法控制输入的速度。我知道它相隔60毫秒,但降低计数固定它出于某种原因 – Jon

+0

@Jon:基本上你是在列表的开头添加一条新消息,然后删除最后一个项目?顺便说一句,你正在使用哪种控制类型?你能给全名包括名字空间吗? – sll

+0

一旦达到一定的限制,是的。它是一个System.Windows.Forms.ListBox – Jon

相关问题