Подтвердить что ты не робот

Как читать combobox из потока, кроме потока, на котором он был создан?

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

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

Дополнительная информация: Перекрестная резьба операция не действительна: Контроль 'levelsComboBox' доступен из нить, отличная от нити создано на.

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

4b9b3361

Ответ 1

Вы можете сделать это следующим образом:

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

Ответ 2

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

Что-то вроде этого:

string text;

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

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

Ответ 3

Самый короткий путь:

string text;
this.Invoke(() => text = combobox.Text);

Ответ 4

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