Delegate.BeginInvoke()/ EndInvoke()实现

时间:2011-10-27 21:45:20

标签: c# .net compiler-construction asynchronous delegates

我想知道如何在委托上实现BeginInvoke/EndInvoke方法。我知道它们是由编译器自动生成的,有点特殊,所以反汇编程序无法处理它们。但最终它的代码被执行了,对吗?由于某种原因,我无法在网上找到c#等价物。你能帮帮我吗?

更新:好的,我不能拥有它,因为它是非托管的东西(虽然我不明白它是如何与ThreadPool完全托管类一起工作的)。你能否建议一篇很好的文章来详细描述这些机制,因为它们中的大多数(如this one)根本没用。

2 个答案:

答案 0 :(得分:4)

这两种方法不是由.NET编译器生成的。如果使用.NET Reflector或ILDSAM,则无法找到方法的任何MSIL代码。它们实际上是由CLR本身提供的,因此根本不使用托管代码实现。

在较高级别,BeginInvoke使用线程池中的线程来执行委托。如果在执行期间发生异常,则会捕获并记住该异常。当调用EndInvoke时,它将重新抛出任何记住的异常,如果不是,它允许您从委托执行中获取结果。这就是有趣的一切。

答案 1 :(得分:3)

  

但最终它的代码被执行了,对吧?

是的,但它是非托管代码。它们被实现为对{CLR中的本机方法的extern调用。这就是为什么你找不到C#等价物。