我在线程中做了一些事情,我试图访问label属性,但我无法设置属性值。
lblDisplay.Visible = true;
我收到了这个错误。 错误 - 跨线程操作无效:控制' lblDisplay'从创建它的线程以外的线程访问。 提前谢谢。
答案 0 :(得分:2)
您应该使用表单上的BeginInvoke
方法在运行的同一个线程上设置变量,例如:
this.BeginInvoke((Action)delegate{ lblDisplay.Visible = true; });
大多数人会告诉你使用Invoke
方法,但除非你绝对需要在线程中的任何其他代码执行之前运行委托中的所有内容,否则你可能不需要它。 Invoke
将阻止线程进一步处理,直到委托完成,其中BeginInvoke
将在表单运行的线程中执行它,同时运行开始调用的线程。
答案 1 :(得分:1)
我认为你首先需要检查是否需要调用(在其他情况下,相同的代码可能不需要调用)所以......
if(lblDisplay.InvokeRequired) {
lblDisplay.Invoke((Action)delegate{ lblDisplay.Visible = true; }); // For synchronous
lblDisplay.BeginInvoke((Action)delegate{ lblDisplay.Visible = true; }) // For asynchronous
}
else
{
lblDisplay.Visible=true;
}
答案 2 :(得分:0)
对lambda使用this.BeginInvoke
方法:
this.BeginInvoke(new Action(() => { lblDisplay.Visible = true; }));
参考:https://msdn.microsoft.com/en-us/library/system.windows.forms.control.begininvoke(v=vs.110).aspx
答案 3 :(得分:0)
Control
只能在创建它的线程中访问 - UI线程。
试试这个,
Invoke(new Action(() =>
{
lblDisplay.Visible = true;
}));
答案 4 :(得分:0)
您无法直接从创建它的线程以外的线程进行访问。您可以使用MethodInvoker设置该属性值。
lblDisplay.Invoke((MethodInvoker)(() => { lblDisplay.Visible = true; }));
这是您在不同线程中访问控件的方式。