C# 谁向类型化委托添加BeginInvoke、Invoke和EndInvoke方法定义?

C# 谁向类型化委托添加BeginInvoke、Invoke和EndInvoke方法定义?,c#,delegates,C#,Delegates,e、 g.如果你写… public delegate void MyTypedDel(int x) Intellisense显示BeginInvoke、Invoke和EndInvoke是MyTypedDel类型定义的一部分。 它们不是委托或多播委托类型定义的一部分。(委托具有DynamicInvoke方法,该方法使用后期/运行时绑定绑定到方法。) 所以我的问题是这些方法在类型化委托类型定义中的混合位置,以及它的实现是什么样子的?我读到。。。Invoke在同一个线程上依次内部调用BeginInvo

e、 g.如果你写…
public delegate void MyTypedDel(int x)

Intellisense显示BeginInvoke、Invoke和EndInvoke是MyTypedDel类型定义的一部分。
它们不是委托或多播委托类型定义的一部分。(委托具有DynamicInvoke方法,该方法使用后期/运行时绑定绑定到方法。)

所以我的问题是这些方法在类型化委托类型定义中的混合位置,以及它的实现是什么样子的?我读到。。。Invoke在同一个线程上依次内部调用BeginInvoke和EndInvoke。这是真的吗


只是好奇引擎盖下的魔法。。也许我错过了一些很明显的事情。。。在这种情况下可能会很残酷:)

编译器生成您的委托类,该类扩展了
委托
BCL类,并添加了特定于委托签名的方法。您可以通过查看reflector中的委托(或BCL委托)并切换到IL视图(因为C#反汇编程序足够智能,可以将其转换回委托声明)来看到这一点。例如:

.class public auto ansi sealed WaitCallback
    extends System.MulticastDelegate
{
    .custom instance void System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) = { bool(true) }
    .method public hidebysig specialname rtspecialname instance void .ctor(object 'object', native int 'method') runtime managed
    {
    }

    .method public hidebysig newslot virtual instance class System.IAsyncResult BeginInvoke(object state, class System.AsyncCallback callback, object 'object') runtime managed
    {
    }

    .method public hidebysig newslot virtual instance void EndInvoke(class System.IAsyncResult result) runtime managed
    {
    }

    .method public hidebysig newslot virtual instance void Invoke(object state) runtime managed
    {
    }

}

编译器完成了大部分工作(参见Kent的回复)。关于连续调用Begin/End的问题;不,不适用于代表。您可以验证这一点,因为
BeginInvoke
将工作推送到
ThreadPool
上,在那里,就像使用
Invoke
一样,工作发生在当前线程上

然而,这种方法在其他一些开始/结束对(特别是IO绑定操作)中很常见;但不适用于代表


我一直在寻找调用Begin/End的更优雅的方法(而不必与
IAsyncResult
等发生冲突)

为什么.method块是空的。。这些方法的实现/IL在哪里?这些调用路由到哪里?我认为这与运行时管理的元数据有关。我猜这相当于一个内部调用,意思是CLR在内部实现这些方法。通过Jeffrey Richter的C#2.0在CLR中找到了我的答案-关于委托的章节。使用delegate关键字时,编译器将创建一个从MulticastDelegate派生的新类型,并添加一个与指定的委托具有相同签名的ctor Invoke(),以及相应的BeginInvoke()和EndInvoke()。