2009-01-12 22 views
12

Niedawno otrzymałem read this thread on MSDN. Tak więc myślałem o używaniu wyrażenia lambda jako sposobu na wywoływanie EndInvoke właśnie w taki sposób, aby upewnić się, że wszystko jest ładne i uporządkowane. Które byłoby bardziej poprawne?Właściwy sposób zakończenia BeginInvoke?

Przykład 1:

Action<int> method = DoSomething; 

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

Przykład 2:

Action<int> method = DoSomething; 

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

Odpowiedz

11

Twój 2-ci przykład jest nieco bardziej wydajny, ponieważ „metoda” instancja delegat nie muszą być ujęte w zamknięciu. Wątpię, byś kiedykolwiek zauważył.

6

Czasami warto czytać this wątek na blogu Haacked użytkownika. nie miałem okazji go przetestować, ale sens jest w jednym z ostatnich wierszy:

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

I faktycznie Przeczytałem ten artykuł i wydaje się rodzajem zbędne do korzystania QueueUserWorkItem, jeśli możesz przekazać lambdę w wywołaniu BeginInvoke. –

+0

KolejkaUserWorkItem może udostępniać inne zaawansowane funkcje zarządzania pulami wątków oprócz wywoływania funkcji EndInvoke. Preferowane jest użycie tego. – configurator

+1

To zależy od tego, czego używasz. W środowisku IIS za pomocą ThreadPool będą używane te same wątki, które są dostępne do przetwarzania żądania. http://stackoverflow.com/questions/1453283/threadpool-in-iis-context –

12

Nie wiem, czy to było możliwe w drodze powrotnej w styczniu '09, ale na pewno teraz można po prostu napisać to:

method.BeginInvoke(5, method.EndInvoke, null); 
Powiązane problemy