2010-10-15 59 views
1

有人告訴我,Invoke()與普通的方法調用類似...那麼爲什麼人們會選擇使用Invoke而不是普通的方法調用?爲什麼會有人想要使用Invoke()(不是BeginInvoke())?

我試着在網上搜索關於這個問題,我得到的是使用BeginInvoke()的優點,但是使用Invoke()有什麼好處?

+0

使用BeginInvoke時,可能會出現http://stackoverflow.com/questions/229554/whats-the-difference-between-invoke-and-begininvoke – 2010-10-15 09:28:29

回答

5

使用BeginInvoke當您想要異步調用委託(在線程池中繪製的線程上)和Invoke(如果要同步調用該委託)。

+3

ThreadPool使用女巫不建議用於長時間運行的過程。 – Peter 2010-10-15 09:22:06

+0

好的回答,好的評論 – 2012-02-01 07:44:27

3

其中一個原因是,如果您通過反射獲得了方法簽名,並且您想動態實例化一個函數,那麼Invoke()就是這樣做的方式。

0

爲了改變,例如,線程執行的東西。

請注意,任何UI控件都應該只能從創建它的線程(實際上是消息泵)操縱。因此,如果另一個線程操縱控件(從其他線程視角同步),那麼BeginInvoke會是額外的開銷,但Invoke沒有問題(特別是因爲至少在WPF中有一個快捷方式可以使多個調用序列更快內部執行)。

0

我想你已經明白代表是什麼,代表什麼,爲什麼是有用的。

如果我有一個名爲「MyDelegate」 deletegate,我能做到「MyDelegate(foo);」或「MyDelegate.Invoke(foo);」,但我總是用第二個,所以我可以很容易地看到,當我檢查代碼,這實際上是一個代表,而不是一個方法。沒有內部差異。

+0

你知道嗎,你不需要額外的「Invoke」來知道它是一個委託而不是一個方法?您可以將鼠標懸停在上面,或按F12鍵。 – Timwi 2010-10-15 10:49:26

+0

我知道:D但我想要認識到,只是閱讀quicly的代碼:) – vtortola 2010-10-18 15:32:43

3

首先值得注意的是,我們必須有類似.Invoke()這樣的語言之間的會面點。正如對C#的int和對VB.NET的IntegerSystem.Int32到它們兩者以及任何其他CLR語言一樣;我們也有任何CLR語言可以訪問的Invoke(),然後他們可以用適合其語法的方式提供額外的語法糖(大多數會考慮C#中嚴重的VB風格約定或VB中嚴重的C#風格約定是句法醋;糖總是必須儘可能匹配其餘的語言)。

添加了這種糖,爲什麼不一直都用它?有些人有時會希望清楚他們正在與代表打交道。有些人不會使用它;我大多沒有。像所有語法糖一樣,優點和缺點都是清晰而非正確的(事實上,看反射器中的x.Invoke()的調用,您會發現它是x(),因爲反射器不知道您使用了哪個)。

相關問題