2009-01-12 9 views
12

J'ai récemment read this thread on MSDN. Donc, je pensais utiliser une expression lambda comme un moyen d'appeler EndInvoke juste comme un moyen de s'assurer que tout est bien rangé. Lequel serait le plus correct?La bonne façon de terminer un BeginInvoke?

exemple 1:

Action<int> method = DoSomething; 

method.BeginInvoke(5, (a)=>{method.EndInvoke(a);}, null); 

Exemple 2:

Action<int> method = DoSomething; 

method.BeginInvoke(5, (a)=> 
            { 
             Action<int> m = a.AsyncState as Action<int>; 
             m.EndInvoke(a); 
            }, method); 

Répondre

11

Votre 2ème exemple est un peu plus efficace parce que l'instance de délégué « méthode » ne doit pas être capturé dans la fermeture. Je doute que vous ayez jamais remarqué.

6

Vous pouvez lire this fil sur le blog de Haacked. N'a pas eu la chance de le tester, mais l'essentiel est dans l'une des dernières lignes:

ThreadPool.QueueUserWorkItem(callback => im.Send(to, from, subject, body)); 
+0

J'ai fait lire cet article, et il semble un peu redondant à utiliser le QueueUserWorkItem si vous pouvez passer un lambda dans l'appel de BeginInvoke. –

+0

QueueUserWorkItem peut fournir d'autres fonctionnalités avancées de gestion de pool de threads en plus d'appeler EndInvoke. Il est préférable d'utiliser cela. – configurator

+1

Cela dépend de ce que vous utilisez pour. Dans l'environnement IIS, l'utilisation de ThreadPool utilise les mêmes threads disponibles pour le traitement des demandes. http://stackoverflow.com/questions/1453283/threadpool-in-iis-context –

12

Je ne sais pas si cela était possible retour moyen Jan '09 dans, mais vous pouvez certainement maintenant il suffit d'écrire ceci:

method.BeginInvoke(5, method.EndInvoke, null); 
Questions connexes