2016-10-15 2 views
0

Мои коды работают нормально, но, когда я делаю thread, я получил операцию кросс-нити, когда вы пытаетесь добавить элемент в ComboBox. Я попытался это коды в backgroundworker тоже, но та же ошибкаНе работает операция поперечного потока?

new Thread(GetInfo).Start(); 

public void GetInfo() 
{ 
    while (true) 
    { 
     if (SellerControlGroup.Enabled) 
     { 
      SqlDataReader Type = new SqlCommand("select type from _Price where Service = 1", sqlCon.con).ExecuteReader(); 
      while (Type.Read()) 
      { 
       string type = Convert.ToString(Type["type"]); 
       ProgramType.Items.Add(type); 
      } 
      Type.Close(); 
     } 
    } 
} 
+0

Вы не можете изменять элементы на потоке пользовательского интерфейса из фоновый поток, вы могли бы использовать делегат для вызова изменений обратно в поток пользовательского интерфейса, хотя – Icepickle

+0

@Icepickle Как я могу использовать делегат для добавления элементов в 'ComboBox' –

+0

Предоставленный образец делегата ниже – Aruna

ответ

2

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

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

new Thread(GetInfo).Start(); 


public void GetInfo() 
{ 
    while (true) 
    { 
     if (SellerControlGroup.Enabled) 
     { 
      SqlDataReader Type = new SqlCommand("select type from _Price where Service = 1", sqlCon.con).ExecuteReader(); 
      while (Type.Read()) 
      { 
       string type = Convert.ToString(Type["type"]); 

       // Update control with the same thread its been created 
       this.Invoke((MethodInvoker)delegate() 
       { 
        ProgramType.Items.Add(type); 
       }); 
      } 
      Type.Close(); 
     } 
    } 
} 
+0

SellerControlGroup также работает с пользовательским интерфейсом. –

+0

Вы можете прочитать свойство управления из другого потока. Только для написания вам нужен делегат. – Aruna

+0

Нет, это не безопасно. Вы не должны «обращаться» к элементу управления пользовательского интерфейса из другого потока. –

0

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

delegate void AddItemDelegate(ComboBox cmb, string value); 

void AddItem(ComboBox cmb, string value) { 
    if (cmb.InvokeRequired) { 
     cbm.Invoke(new AddItemDelegate(AddItem), cmb, value); 
    } else { 
     cmb.Items.add(value); 
    } 
} 

, а затем просто использовать

AddItem(ProgramType, type);