跨线程操作无效?

时间:2016-10-15 10:29:15

标签: c# .net multithreading winforms

我的代码工作正常但是,当我创建线程时,我尝试将项目添加到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();
        }
    }
}

2 个答案:

答案 0 :(得分: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();
        }
    }
}

答案 1 :(得分:0)

您可以使用委托来调用UI线程上的更改,如此

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 );