2011-10-27 20 views
4

我想知道BeginInvoke/EndInvoke方法是如何在委託上實現的。我知道它們是由編譯器自動生成的,有點特別,所以反彙編程序無法處理它們。但最終它的代碼正在執行,對吧?出於某種原因,我無法在網上找到c#等價物。你能幫助我嗎?Delegate.BeginInvoke()/ EndInvoke()的實現

更新:好吧,我不能擁有它,因爲它是非管理的東西(雖然我不明白它是如何與ThreadPool這是絕對管理的類)。你能否建議一篇很好的文章,詳細描述機制,因爲大多數文章(如this one)根本沒有用處。

回答

4

這兩個方法不是由.NET編譯器生成的。如果您使用.NET Reflector或ILDSAM,則不會爲這些方法找到任何MSIL代碼。它們實際上是由CLR本身提供的,因此實際上並未使用託管代碼實際實現。

在高層次上,BeginInvoke使用線程池中的線程來執行委託。如果執行過程中發生異常,則會被捕獲並記住。當調用EndInvoke時,它將重新拋出任何記憶的異常,如果不是,它允許您從委託執行中獲得結果。這就是有趣的一切。

+1

它們*由*編譯器生成;它是JIT編譯器而不是C#編譯器。 – Gabe

+0

感謝您的澄清。我已經更新了答案以反映它。 –

3

但最後它的代碼正在執行,對吧?

是的,但它是非託管代碼。它們被實現爲調用CLR中的本地方法的extern。這就是爲什麼你找不到C#等價物。

相關問題