跨线程操作

时间:2015-04-10 04:17:04

标签: c# multithreading winforms

我在线程中做了一些事情,我试图访问label属性,但我无法设置属性值。

lblDisplay.Visible = true;

我收到了这个错误。 错误 - 跨线程操作无效:控制' lblDisplay'从创建它的线程以外的线程访问。 提前谢谢。

5 个答案:

答案 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; }));

这是您在不同线程中访问控件的方式。