2009-01-12 23 views
12

Hace poco read this thread on MSDN. Así que estaba pensando en utilizar una expresión lambda como una forma de llamar a EndInvoke solo para asegurarse de que todo esté ordenado y ordenado. ¿Cuál sería más correcto?¿La forma correcta de finalizar un BeginInvoke?

ejemplo 1:

Action<int> method = DoSomething; 

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

Ejemplo 2:

Action<int> method = DoSomething; 

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

Respuesta

11

Su segundo ejemplo es ligeramente más eficiente porque la instancia delegado "método" no tiene que ser capturado en el cierre. Dudo que alguna vez te hayas dado cuenta.

6

Es posible que desee leer this hilo en el blog de Haacked. no han tenido la oportunidad de probarlo, pero la esencia está en una de las últimas líneas:

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

De hecho, me he leído ese artículo, y parece redundante tipo de usar QueueUserWorkItem si puede pasar un lambda en la llamada a BeginInvoke. –

+0

QueueUserWorkItem puede proporcionar otras funciones avanzadas de administración de grupos de hilos además de llamar a EndInvoke. Se prefiere usar eso. – configurator

+1

Depende de lo que está utilizando. En el entorno de IIS, el uso de ThreadPool utilizará los mismos hilos que están disponibles para el procesamiento de solicitudes. http://stackoverflow.com/questions/1453283/threadpool-in-iis-context –

12

No sé si esto era posible allá por Ene '09, pero sin duda ahora sólo puedo escribir esto:

method.BeginInvoke(5, method.EndInvoke, null); 
Cuestiones relacionadas