2009-03-25 10 views
3

par exemple. si vous écrivez ...
public delegate void MyTypedDel(int x)
Intellisense montre que BeginInvoke, Invoke et EndInvoke font partie de la définition de type MyTypedDel.
Ils ne font pas partie de la définition de type Delegate ou MulticastDelegate. (Delegate a une méthode DynamicInvoke qui utilise la liaison late/runtime pour lier une méthode.)Qui ajoute les définitions de méthode BeginInvoke, Invoke et EndInvoke à un délégué typé?

Donc, ma question est où sont ces méthodes mélangées dans la définition de type de délégué typée et à quoi ressemble son implémentation? J'ai lu cela ... Invoke appelle en interne BeginInvoke et EndInvoke successivement sur le même thread. Est-ce vrai?

curieux de la magie sous le capot ici .. Peut-être que je manqué quelque chose de réel évident ... dans ce cas, être brutal :)

Répondre

5

Le compilateur génère votre classe de délégué, qui étend la classe BCL et Delegate ajoute des méthodes spécifiques à la signature de votre délégué. Vous pouvez le voir en regardant votre délégué (ou un délégué BCL) dans le réflecteur et en passant en mode IL (puisque le désassembleur C# est assez intelligent pour le remettre dans une déclaration de délégué). Exemple:

.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 
    { 
    } 

} 
+0

Pourquoi les blocs .method sont-ils vides .. comme dans où est l'implémentation/IL pour ces méthodes? Où sont acheminés ces appels? – Gishu

+0

Je pense que c'est lié aux métadonnées gérées à l'exécution. Je suppose que c'est équivalent à InternalCall, ce qui signifie que le CLR implémente ces méthodes en interne. –

+0

ooh .. plus de poussière magique;) Merci d'avoir répondu ... utile. – Gishu

1

Le compilateur effectue la plupart de ce travail (voir la réponse de Kent). Re la question d'appeler Begin/End en succession; non, pas pour les délégués. Vous pouvez vérifier cela, car BeginInvoke pousse le travail sur le ThreadPool, où -comme si vous utilisez Invoke le travail se passe sur le thread en cours. Cette approche, cependant, est commune à d'autres paires Begin/End (en particulier des opérations liées à IO); mais pas pour les délégués.

J'ai regardé des manières plus gracieuses d'appeler Begin/End (sans jouer avec IAsyncResult etc.) - see here for more.