2011-09-01 39 views
1

我明白必須使用調用/的BeginInvoke使從工作線程函數或過程,其修改屬於UI線程組件的調用打擾...爲什麼有InvokeRequired

我的問題是 - 有麻煩檢查InvokeRequired的一個很好的理由是什麼?假設一個事件處理程序可以在不同情況下從工作者線程或UI線程調用。調用UI線程調用它自己最終會執行的方法會產生什麼後果?

說...

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

現在,假設從UI線程,但事件2和/或3火從其他線程事件1火災...有任何危險爲事件1調用調用,無論如何,即使它不必?它只是有點低效?

+1

請參閱http://stackoverflow.com/questions/747210/whats-wrong-with-calling-invoke-regardless-of-invokerequired – stuartd

+0

@ Stuart - 謝謝。我爲這個問題添加了標籤,使它更易於搜索。 –

回答

2

是否對UI線程調用有任何影響調用它本身最終執行的方法?

我知道的唯一區別是如果在創建控件的句柄之前調用Invoke將失敗。

article討論了更詳細的問題。

+0

如果這篇文章是正確的,它的確會產生一個強有力的觀點:「事實上,在這種情況下,Invoke方法將」做正確的事情「,並直接簡單地調用目標委託,而不是嘗試將它們編組到線程中擁有Control實例。「任何人都可以反駁這個嗎?這是不是進一步削弱了InvokeRequired被...所要求的情況? –

2

是否對UI線程調用有任何影響調用它本身最終會執行的方法?

不,沒有任何後果,除了可能性能,如果不需要調用,直接方法調用將比通過Invoke基礎結構更快。

+0

它似乎工作得很好,所以我想到了很多。這是一個嵌入式控制系統,所以有一個非常鐵的保證,沒有別的東西在系統上運行,但這是一個應用程序。無論如何,我認爲這可能仍然是最好的做法,即使我的訂單處理空間比我需要的要多。 –