如何从除创建它之外的线程读取combobox?

我试图从一个线程读取一个combobox.Text而不是它创建的线程,但我收到错误:

System.Windows.Forms.dll中发生了未处理的“System.InvalidOperationException”类型exception

附加信息:跨线程操作无效:控制’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变量在返回后将包含combobox文本的值。

最短的方法是:

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

最简单的解决方案是使用BackgroundWorker类在另一个线程上执行工作,同时仍然能够更新UI(例如,在报告进度或任务完成时)。