如何从除创建它之外的线程读取组合框?

时间:2011-04-01 16:23:46

标签: c# multithreading thread-safety invoke

我正在尝试从除了创建它的线程之外的线程读取一个combobox.Text,但是我收到了错误:

  

未处理的类型异常   'System.InvalidOperationException'   发生在System.Windows.Forms.dll

中      

其他信息:跨线程   操作无效:控制   'levelsComboBox'从一个访问   线程以外的线程   创建于。

之前我曾使用.Invoke但只设置属性,我怎样才能用它来读取combobox.Text?因为.Invoke返回void,我需要一个字符串。或者没有Invoke会有另一种方法吗?

4 个答案:

答案 0 :(得分:50)

你可以这样做:

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

答案 1 :(得分:17)

您仍然可以使用Invoke并将其读取到本地变量。

这样的事情:

string text;

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

由于Invoke是同步的,因此您可以保证text变量在返回后包含组合框文本的值。

答案 2 :(得分:4)

最短的方式是:

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

答案 3 :(得分:2)

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