Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从创建combobox的线程以外的线程中读取combobox?_C#_Multithreading_Thread Safety_Invoke - Fatal编程技术网

C# 如何从创建combobox的线程以外的线程中读取combobox?

C# 如何从创建combobox的线程以外的线程中读取combobox?,c#,multithreading,thread-safety,invoke,C#,Multithreading,Thread Safety,Invoke,我正在尝试读取一个组合框。文本来自创建它的线程以外的线程,但我收到错误: 类型的未处理异常 “System.InvalidOperationException” 发生在System.Windows.Forms.dll中 附加信息:交叉线程 操作无效:控件 “levelsComboBox”可从 线程,而不是原来的线程 创建于 我以前使用过.Invoke,但仅用于设置属性,如何使用它读取combobox.Text?因为.Invoke返回void,我需要一个字符串。或者没有调用还有其他方法吗?最简单的

我正在尝试读取一个组合框。文本来自创建它的线程以外的线程,但我收到错误:

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

附加信息:交叉线程 操作无效:控件 “levelsComboBox”可从 线程,而不是原来的线程 创建于


我以前使用过.Invoke,但仅用于设置属性,如何使用它读取combobox.Text?因为.Invoke返回void,我需要一个字符串。或者没有调用还有其他方法吗?

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

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

大概是这样的:

string text;

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

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

您可以这样做:

string text;

this.Invoke(new MethodInvoker(delegate() { text = combobox.Text; }));
this.Invoke((MethodInvoker)delegate()
    {
        text = combobox.Text;
    });
最短的路线是:

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

我有2天的时间来寻找这个解决方案。Thnx工作得很好。它帮助我在C#中实现了观测者模式。我认为这是它的一个副本,它似乎不起作用。参见链接:@YongkeBillYu该链接要求登录。我不明白为什么它不能工作,它应该和公认的解决方案一样。@Igor但有一个警告:编译器会抱怨代码,除非。请编辑代码。