Delegate.BeginInvoke()/EndInvoke()实现

问题描述 投票:0回答:2

我想知道

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

更新:好吧,我不能拥有它,因为它是非托管的东西(尽管我不明白它如何与绝对托管类的

ThreadPool
一起工作)。你能推荐一篇详细描述机制的好文章吗,因为它们中的大多数(比如这个)根本没有用。

c# .net asynchronous delegates
2个回答
4
投票

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

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


3
投票

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

是的,但它是非托管代码。它们通过对 CLR 中本机方法的

extern
调用来实现。这就是为什么你找不到 C# 等效项。

© www.soinside.com 2019 - 2024. All rights reserved.