3

我正在开始新线程:

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

更新列表输出:

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

我收到错误:

跨线程操作无效:控件“OutputBox”从创建它的线程以外的线程访问。

我怎么能运行这个?

4

3 回答 3

16

尝试这个

this.Invoke((MethodInvoker)(() => OutputBox.Items.Add(engineOutput)));
于 2013-08-30T13:47:38.233 回答
0

尝试这个

void UpdateListOutput()
    {

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

            }));


    }
于 2017-11-02T12:04:45.523 回答
-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;

    }));

}

而这种简单的改变使我的代码可以像我想要的那样工作。

于 2021-01-04T22:51:22.357 回答