2016-11-06 253 views
-2

我是一名新生,基本刚刚进入主题线程。新手需要一些线程帮助

我必须做的事似乎很简单。 我必须做一个组合框,但我需要使用不同的线程来填充它。 那是我遇到麻烦的原因;

附加信息:跨线程操作无效:控制'ComboBox'从除创建线程以外的线程访问。

所以我做了一些研究,看来你不能在主线程之外填充UI元素。所以我坐在这里挠挠头脑,想什么是最好的事情。

帮助将不胜感激。

哦顺便说一句,它的C#和Windows窗体。

  public Customer() 
    { 
     InitializeComponent(); 
     Thread red = new Thread(Fill); 
     red.Start(); 
    } 
    public void Fill() 
    { 
     Thread.Sleep(5000); 
     ComboBox1.Items.Add(1); 
     ComboBox1.Items.Add(2); 
     ComboBox1.Items.Add(3); 
     ComboBox1.Items.Add(4); 
     ComboBox1.Items.Add(5); 
     ComboBox1.Items.Add(6); 
     ComboBox1.Items.Add(7); 
    } 
+0

1.提供导致问题的实际代码。 2.使用适当的标签。这个问题是关于C#和Winforms,而不是关于C – UnholySheep

+0

它删除了我的#以某种方式,我知道C是不同的。但是,谢谢,我现在要做到这一点 – meowlady

+2

顺便说一句,在大多数GUI框架中,修改不同线程的UI元素是有原因的,但是谁告诉你,你应该做的事情是不清楚或者错误的。 – UnholySheep

回答

-1

你应该考虑使用任务并行库,明确地创建一个线程现在被认为是遗留代码。但是,要修复您的代码,您需要调用UI线程上的UI更新。

public void Fill() 
{ 
    Thread.Sleep(5000); 

    Action doUIWork =() => 
    { 
     ComboBox1.Items.Add(1); 
     ComboBox1.Items.Add(2); 
     ComboBox1.Items.Add(3); 
     ComboBox1.Items.Add(4); 
     ComboBox1.Items.Add(5); 
     ComboBox1.Items.Add(6); 
     ComboBox1.Items.Add(7); 
    }; 

    this.Invoke(doUIWork); 
}