2016-11-06 126 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); 
}