Как прочитать комбинированный список из потока, отличного от потока, в котором он был создан? - PullRequest
28 голосов
/ 01 апреля 2011

Я пытаюсь прочитать комбобокс.Текст из потока, отличного от потока, в котором он был создан, но я получаю сообщение об ошибке:

Произошло необработанное исключение типа 'System.InvalidOperationException'in System.Windows.Forms.dll

Дополнительная информация: операция с несколькими потоками недопустима: доступ к элементу управления 'levelsComboBox' осуществляется из потока, отличного от потока, в котором он был создан.Я использовал .Invoke раньше, но только для установки свойств, как я могу использовать его для чтения combobox.Text?Потому что .Invoke возвращает void, и мне нужна строка.Или есть другой способ сделать это без Invoke?

Ответы [ 4 ]

50 голосов
/ 01 апреля 2011

Вы можете сделать это так:

this.Invoke((MethodInvoker)delegate()
    {
        text = combobox.Text;
    });
17 голосов
/ 01 апреля 2011

Вы все еще можете использовать Invoke и считывать его в локальную переменную.

Примерно так:

string text;

this.Invoke(new MethodInvoker(delegate() { text = combobox.Text; }));

Поскольку Invoke является синхронным, у вас есть гарантия, что text переменная будет содержать значение текста поля со списком после его возврата.

4 голосов
/ 03 февраля 2012

Кратчайший путь:

string text;
this.Invoke(() => text = combobox.Text);
3 голосов
/ 01 апреля 2011

Самое простое решение - использовать класс BackgroundWorker для выполнения работы в другом потоке, при этом все еще имея возможность обновлять пользовательский интерфейс (например, при сообщении о ходе выполнения или после завершения задачи).

...