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

nit*_*kli 28 c# multithreading invoke thread-safety

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

System.Windows.Forms.dll中发生了未处理的"System.InvalidOperationException"类型异常

附加信息:跨线程操作无效:控制'levelsComboBox'从其创建的线程以外的线程访问.

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

Bra*_*der 51

你可以这样做:

this.Invoke((MethodInvoker)delegate()
    {
        text = combobox.Text;
    });
Run Code Online (Sandbox Code Playgroud)

  • 我有 2 天的时间来寻找这个解决方案。谢谢 (2认同)

Joã*_*elo 17

您仍然可以使用Invoke它并将其读取到局部变量.

像这样的东西:

string text;

this.Invoke(new MethodInvoker(delegate() { text = combobox.Text; }));
Run Code Online (Sandbox Code Playgroud)

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


Igo*_*huk 5

最短的方法是:

string text;
this.Invoke(() => text = combobox.Text);
Run Code Online (Sandbox Code Playgroud)