2016-11-07 2 views
0

Читал на фоне рабочего, в основном метод doWork. Он заявил, что это должно иметь расчеты, но не должно зависеть от кода GUI. Это моя функция:Некоторые уточнения на фоне рабочего

void fillLiguanea() 
{ 
    // this.liguanea_LaneTableAdapter1.Fill(this.pharmaciesDataSet1.Liguanea_Lane); 
    try 
    { 
     string connectionString = "Data Source=LPMSW09000012JD\\SQLEXPRESS;Initial Catalog=Pharmacies;Integrated Security=True"; 
     SqlConnection con = new SqlConnection(connectionString); 
     con.Open(); 
     string query = "SELECT * FROM dbo.Liguanea_Lane2"; 
     SqlCommand cmd = new SqlCommand(query, con); 

     SqlDataReader dr = cmd.ExecuteReader(); 
     while (dr.Read()) 
     { 
      string scode = dr.GetString(dr.GetOrdinal("code")); 
      comboBox2.Items.Add(scode); 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString()); 
    } 
} 

В приведенной выше функции есть comboBox под названием: "comboBox2." Мой вопрос заключается в том, что это означает, что я не мог назвать свою общую функцию выше в методе doWork только из-за этого контроллера comboBox?

+1

Заполните '' List и назначить его e.Result. Затем обработчик события RunWorkerCompleted может обновить выпадающий список. –

+0

В разделе «Переполнение стека» уже много вопросов и вопросов, как взаимодействовать с объектами пользовательского интерфейса из другого потока, включая рабочий поток, используемый «BackgroundWorker». См. Отмеченный дубликат для одного такого примера. Если вы все еще испытываете трудности, прочитав большой объем доступной информации, задайте новый вопрос, который включает в себя хороший [mcve], который четко показывает, что вы пробовали, с подробным объяснением того, какие исследования вы уже сделали, и что конкретно, у вас все еще есть проблемы с пониманием. –

ответ

0

Фоновый работник в основном устарел, если вы используете .Net 4.5 или новее в пользу async/wait. Поэтому, если вы собираетесь узнать что-то новое, я предлагаю вам это узнать.

Если вы все еще собираетесь использовать BackgroundWorker, вы бы поднять ProgressChanged события в вашей while петли и вы COMBOBOX манипуляций в реализации этого обработчика событий, так что вы имеете доступ к резьбе UI.

Редактировать

Поскольку действительно нет причин для обновления выпадающего как вы идете, я бы совет Ганса.

0

Основная идея заключается в том, что вы не можете совершать какие-либо вызовы gui или изменения из текущего рабочего рабочего потока (функция doWork) по той простой причине, что это не тот поток, а основной поток, который создал графический объект. (вы не можете модифицировать объект, созданный под другим потоком)

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

Будьте осторожны при вызове, но более безопасно использовать invoke_required.

чек Google для статей о том, как сделать безопасный кросс нить операции