如何从其他线程向listBox添加项?

时间:2013-08-30 13:45:25

标签: c# multithreading

我正在开始新的主题:

Thread t = new Thread(UpdateListOutput);    
t.IsBackground = true;    
t.Start();

UpdateListOutput:

void UpdateListOutput()
{
    while (true)
    {
        if (!string.IsNullOrEmpty(engineOutput))
        {
            OutputBox.Items.Add(engineOutput);
        }
    }
}

我发现错误:

  

跨线程操作无效:从a访问控制'OutputBox'   除了创建它的线程以外的线程。

我该如何运行?

3 个答案:

答案 0 :(得分:13)

试试这个

this.Invoke((MethodInvoker)(() => OutputBox.Items.Add(engineOutput)));

答案 1 :(得分:0)

试试这个

void UpdateListOutput()
    {

            Dispatcher.BeginInvoke(new Action(() => {
                while (true)
                {
                    if (!string.IsNullOrEmpty(engineOutput))
                    {
                        OutputBox.Items.Add(engineOutput);
                    }
                }                

            }));


    }

答案 2 :(得分:-1)

我有一个方法 seleniumCode() 使用 Selenium 的“chromedriver”来做一些事情。该方法通过单击 de GUI 上的按钮调用,该按钮使用执行的主线程。当此方法运行时,GUI 被“阻塞”,因为主线程被 seleniumCode() 折叠。为了使这项工作正常进行,我像这样调用了 seleniumCode():

Thread th = new Thread(new ThreadStart(seleniumCode));
th.Start();

问题来了:我在 seleniumCode() 中有一些对 'writeLbx("each string")' 的调用。而且我无法在 ListBox 上书写,因为它来自另一个线程。所以,在经历了 2 周的大脑崩溃之后,我来到了这里。

我选择了你的一些代码的一部分来制作这个:

private void writeLbx(string s)
{
    switch (s)
    {
        case "Empezando_Tracking": lbxProcess.Items.Add("xxx");
                    break;
        case "Mi Cuenta": lbxProcess.Items.Add("xxx");
                    break;
        case "Email_Pass": lbxProcess.Items.Add("xxx");
                    break;
        case "Iniciar sesión": lbxProcess.Items.Add("xxx");
                    break;
        case "Procesando_Intento": lbxProcess.Items.Add("xxx");
                    break;
        case "Precio_OK": lbxProcess.Items.Add("xxx");
                    break;
        case "Poner_Cantidad": lbxProcess.Items.Add("xxx");
                    break;
    }

    lbxProcess.Update();
    lbxProcess.TopIndex = lbxProcess.Items.Count - 1;
}

...进入这个:

private void writeLbx(string s)
{

    this.Invoke(new Action(() =>
    {

        switch (s)
        {
            case "Empezando_Tracking": lbxProcess.Items.Add("xxx");
                    break;
            case "Mi Cuenta": lbxProcess.Items.Add("xxx");
                    break;
            case "Email_Pass": lbxProcess.Items.Add("xxx");
                    break;
            case "Iniciar sesión": lbxProcess.Items.Add("xxx");
                    break;
            case "Procesando_Intento": lbxProcess.Items.Add("xxx");
                    break;
            case "Precio_OK": lbxProcess.Items.Add("xxx");
                    break;
            case "Poner_Cantidad": lbxProcess.Items.Add("xxx");
                    break;
        }

        lbxProcess.Update();
        lbxProcess.TopIndex = lbxProcess.Items.Count - 1;

    }));

}

这个简单的改变让我的代码可以像我想要的那样工作。