Использование InvokeRequired vs control.InvokeRequired

В чем разница между InvokeRequired и somecontrol.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;
    }
}

Ответ 1

Первая версия проверяет поток, ответственный за этот элемент управления. Вторая версия проверяет поток, ответственный за someControl. (И то же самое, за какой поток управления они делегируют вызов.)

Они потенциально могут быть разными - хотя их действительно не должно быть, если два элемента управления находятся в одном и том же окне верхнего уровня. (Все элементы управления в одном окне должны работать в одном потоке.)

Ответ 2

Разница заключается в том, что вы контролируете доступ к свойству. Если вы получаете доступ к InvokeRequired из метода в форме, вы эффективно получаете доступ к свойству InvokeRequired формы.

Если форма и someControl создаются в том же потоке, они возвратят одно и то же значение.

Ответ 3

Казалось бы, вы в первом примере попадаете в рамки элемента управления, а во втором - нет. Основная форма - это контроль, как и любой другой. Если someControl добавлен в коллекцию Control основного элемента управления, вы можете использовать либо.