Зачем нужен InvokeRequired

Я понимаю необходимость использования Invoke / BeginInvoke для выполнения вызовов из рабочих потоков к функциям или процедурам, которые вносят изменения в компоненты, принадлежащие потоку пользовательского интерфейса ...

У меня вопрос - есть ли веская причина потрудиться с проверкой InvokeRequired? Скажем, обработчик событий может быть вызван либо из рабочего потока, либо из потока пользовательского интерфейса в различных обстоятельствах. Есть ли какие-либо последствия того, что поток пользовательского интерфейса вызывает Invoke для метода, который он сам будет выполнять?

Сказать...

Private Sub SomeProcedure() Handles event1, event2, event3
  Me.Invoke(New delegateSomeProc(Address of SomeProc))
EndSub

Теперь предположим, что event1 запускается из потока пользовательского интерфейса, но события 2 и / или 3 запускаются из какого-то другого потока ... есть ли какая-либо опасность для вызова event1 в любом случае, даже если это не обязательно? Это немного неэффективно?


person J...    schedule 01.09.2011    source источник
comment
См. stackoverflow.com / questions / 747210 /   -  person stuartd    schedule 01.09.2011
comment
@ Стюарт - спасибо. Я добавил теги к этому вопросу, чтобы сделать его более доступным для поиска.   -  person J...    schedule 01.09.2011


Ответы (2)


Есть ли какие-либо последствия того, что поток пользовательского интерфейса вызывает Invoke для метода, который он сам будет выполнять?

Единственное различие, о котором я знаю, заключается в том, что использование Invoke завершится ошибкой, если вызывается до создания дескриптора элемента управления.

Это статья обсуждает проблемы более подробно.

person David Heffernan    schedule 01.09.2011
comment
Если эта статья верна, это действительно сильный и интересный момент: на самом деле, метод Invoke поступит правильно в этом случае и просто вызовет целевой делегат напрямую, а не пытается направить его в поток, владеющий элементом управления. пример. Кто-нибудь может это опровергнуть? Разве это не ослабляет еще больше аргументов в пользу того, что InvokeRequired ... требуется? - person J...; 01.09.2011

Есть ли какие-либо последствия того, что поток пользовательского интерфейса вызывает Invoke для метода, который он сам будет выполнять?

Нет, нет никаких последствий, кроме, вероятно, производительности, поскольку если вызов не требуется, прямой вызов метода будет быстрее, чем прохождение через инфраструктуру Invoke.

person Darin Dimitrov    schedule 01.09.2011
comment
Казалось, что все работает нормально, так что я так и подумал. Он предназначен для встроенной системы управления, поэтому есть довольно надежная гарантия, что в системе никогда не будет работать ничего, кроме этого одного приложения. Я полагаю, что, вероятно, было бы лучше сделать это в любом случае, даже если у меня есть заказы, у которых больше ресурсов для обработки, чем мне нужно. - person J...; 01.09.2011