2016-11-06 4 views
-2

Я новый студент и в основном просто попал в тему пронизывания.Новичкам нужна какая-то помощь при прошивке

Что я должен делать, кажется довольно простым. Мне нужно сделать combobox, но мне нужно заполнить его, используя другой поток. И вот где я столкнулся с бедой, причиной;

Дополнительная информация: Работа с кросс-нитями не действительна: Control 'ComboBox' доступен из потока, отличного от потока, на котором он был создан.

Итак, я провел некоторое исследование, и кажется, что вы не можете заполнить элементы пользовательского интерфейса вне основной темы. Поэтому я сижу, царапая голову, думая, что лучше всего делать.

Справка будет принята с благодарностью.

Oh btw, его C# и в виде окон.

  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

И, кстати, изменение большинства элементов интерфейса из разных потоков запрещено в большинстве графических интерфейсов (по уважительным причинам), кто бы ни сказал, что это то, что вам нужно делать, было либо неясным, либо неправильным. – UnholySheep

ответ

-1

Вы должны рассмотреть возможность использования параллельной библиотеки задач, при этом создание потока явно рассматривается как устаревший код. Однако, чтобы исправить ваш код, вам нужно вызвать обновления пользовательского интерфейса в потоке пользовательского интерфейса.

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); 
} 
Смежные вопросы