我想知道如何在委托上实现BeginInvoke/EndInvoke
方法。我知道它们是由编译器自动生成的,有点特殊,所以反汇编程序无法处理它们。但最终它的代码被执行了,对吗?由于某种原因,我无法在网上找到c#等价物。你能帮帮我吗?
更新:好的,我不能拥有它,因为它是非托管的东西(虽然我不明白它是如何与ThreadPool
完全托管类一起工作的)。你能否建议一篇很好的文章来详细描述这些机制,因为它们中的大多数(如this one)根本没用。
答案 0 :(得分:4)
这两种方法不是由.NET编译器生成的。如果使用.NET Reflector或ILDSAM,则无法找到方法的任何MSIL代码。它们实际上是由CLR本身提供的,因此根本不使用托管代码实现。
在较高级别,BeginInvoke使用线程池中的线程来执行委托。如果在执行期间发生异常,则会捕获并记住该异常。当调用EndInvoke时,它将重新抛出任何记住的异常,如果不是,它允许您从委托执行中获取结果。这就是有趣的一切。
答案 1 :(得分:3)
但最终它的代码被执行了,对吧?
是的,但它是非托管代码。它们被实现为对{CLR中的本机方法的extern
调用。这就是为什么你找不到C#等价物。