使用InvokeRequired vs control.InvokeRequired

时间:2009-02-09 12:28:54

标签: c#

InvokeRequiredsomecontrol.InvokeRequired之间的区别是什么?

像这样,

delegate void valueDelegate(string value);

private void SetValue(string value)
{
   if (InvokeRequired)
   {
       BeginInvoke(new valueDelegate(SetValue),value);
   }
   else
   {
       someControl.Text = value;
   }
}

delegate void valueDelegate(string value);

private void SetValue(string value)
{   
    if (someControl.InvokeRequired)
    {
        someControl.Invoke(new valueDelegate(SetValue),value);
    }
    else
    {
        someControl.Text = value;
    }
}

3 个答案:

答案 0 :(得分:20)

第一个版本检查负责控件的线程。第二个版本检查负责someControl的线程。 (并且他们然后将控件的线程委托给哪个控件的线程。)

它们可能有所不同 - 尽管如果两个控件位于同一个顶级窗口中,它们确实不应该。 (一个窗口中的所有控件都应该在同一个线程上运行。)

答案 1 :(得分:3)

区别在于您访问该属性的控制权。如果从表单上的方法中访问InvokeRequired,则可以有效地访问表单的InvokeRequired属性。

如果在同一个线程中创建了form和someControl,那么它们将返回相同的值。

答案 2 :(得分:2)

看起来你在第一个例子中是在一个控件的范围内,而在第二个例子中你不是。主窗体就像任何其他控件一样。如果someControl添加到主控件的Control集合中,则可以使用其中一个。