Использование 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 основного элемента управления, вы можете использовать либо.