Delegate.BeginInvoke()/EndInvoke()的实现

4
我想了解委托中的BeginInvoke / EndInvoke方法是如何实现的。我知道它们是由编译器自动生成的,有点特殊,因此反汇编程序无法处理它们。但最终执行的是代码,对吧?出于某种原因,我在网络上找不到C#的等效代码。你能帮我解决这个问题吗?
更新:好的,我无法获取它,因为它是未经处理的内容(尽管我不理解它与ThreadPool这个完全受控的类如何配合工作)。你能推荐一篇详细描述机制的好文章吗?因为大多数文章(如这篇文章)完全没有用处。
2个回答

4
这两种方法并非由.NET编译器生成。如果使用.NET Reflector或ILDSAM,您将无法找到这些方法的MSIL代码。它们实际上是由CLR本身提供的,因此根本不是使用托管代码实现的。
从高层次上讲,BeginInvoke使用线程池中的线程来执行委托。如果在执行期间发生异常,则会被捕获和记忆。当调用EndInvoke时,它将重新抛出任何已记住的异常,如果没有,则允许您从委托执行中获取结果。这就是它所做的所有有趣的事情。

1
它们是由编译器生成的;这是JIT编译器而不是C#编译器。 - Gabe
谢谢你的澄清。我已经更新了答案以反映它。 - Phil Wright

3

但最终执行的是代码,对吧?

对的,但它是非受控代码。它们被实现为 CLR 中本地方法的extern调用。这就是为什么你找不到 C# 的等效方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接