C# 如何从创建combobox的线程以外的线程中读取combobox?
我正在尝试读取一个组合框。文本来自创建它的线程以外的线程,但我收到错误: 类型的未处理异常 “System.InvalidOperationException” 发生在System.Windows.Forms.dll中 附加信息:交叉线程 操作无效:控件 “levelsComboBox”可从 线程,而不是原来的线程 创建于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,我需要一个字符串。或者没有调用还有其他方法吗?最简单的
我以前使用过.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但有一个警告:编译器会抱怨代码,除非。请编辑代码。