Ответ 1
Вы можете сделать это следующим образом:
this.Invoke((MethodInvoker)delegate()
{
text = combobox.Text;
});
Я пытаюсь прочитать combobox.Text из потока, отличного от потока, на котором он был создан, но я получаю сообщение об ошибке:
Необработанное исключение типа 'System.InvalidOperationException' произошел в System.Windows.Forms.dll
Дополнительная информация: Перекрестная резьба операция не действительна: Контроль 'levelsComboBox' доступен из нить, отличная от нити создано на.
Я использовал .Invoke раньше, но только для установки свойств, как я могу использовать его для чтения combobox.Text? Потому что .Invoke возвращает void, и мне нужна строка. Или есть ли другой способ сделать это без Invoke?
Вы можете сделать это следующим образом:
this.Invoke((MethodInvoker)delegate()
{
text = combobox.Text;
});
Вы все равно можете использовать Invoke
и прочитать его в локальной переменной.
Что-то вроде этого:
string text;
this.Invoke(new MethodInvoker(delegate() { text = combobox.Text; }));
Поскольку Invoke
является синхронным, у вас есть гарантия, что переменная text
будет содержать значение текста со списком после его возврата.
Самый короткий путь:
string text;
this.Invoke(() => text = combobox.Text);
Самое простое решение - использовать класс BackgroundWorker для выполнения работы над другим потоком, при этом все еще имея возможность обновлять пользовательский интерфейс (например, когда сообщается о прогрессе или когда задача завершена).