2013-12-21 1 views
3

Скажет, у меня есть следующая подпрограмма, которая просто добавляет переданные элементы к элементу управления ListView:Какова цель вызова Invoke из определенного элемента управления, который затронут?

Private Sub AddListItem(ByVal item As ListViewItem) 
    UIList.Items.Add(item) 
End Sub 

И я использую, что из потока BackgroundWorker, например, так:

UIList.BeginInvoke(Sub() AddListItem(lvItem)) 

Ну совершенно случайно Я только что обнаружил, что не имеет значения , который используется для вызова метода Invoke\BeginInvoke, или даже если я вообще опускаю элемент управления и просто вызываю метод напрямую, который, как я предполагаю, просто использует Me.<Method> за кулисами - это не кажется имеет значения. Код все еще работает.

Итак, используется ли затронутый элемент управления, чтобы вызвать метод, просто способ сделать следующий код проще? Какие, если таковые имеются, другие преимущества? И есть ли определенные недостатки, о которых нужно знать при использовании другого элемента управления?

ответ

1

Используя ILSpy и землеройный вниз Control.Invoke method, выдержка является

... 
UnsafeNativeMethods.PostMessage(
    new HandleRef(this, this.Handle), 
    Control.threadCallbackMessage, 
    IntPtr.Zero, 
    IntPtr.Zero); 
... 

Кроме того, MSDN states:

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

Как правило, не имеет значения, какой контроль вы отправляете.

Лично я использую «ближайшее» управление, которое я могу получить, чтобы вызвать метод Invoke.

+1

Черт! Я считал, что прочитал эту страницу MSDN, но почему-то пропустил это замечание. В любом случае, спасибо. :) – Ants1060

 Смежные вопросы

  • Нет связанных вопросов^_^