2010-04-13 17 views
5

Considérame oxidado sobre el tema de los delegados asincrónicos.La forma correcta de Fire-and-Forget un delegado asincrónico

Si quiero llamar a un método de forma asíncrona, en un estilo de "olvidar y olvidar", ¿es esta una forma adecuada de hacerlo?

Action action = DoSomething; 
action.BeginInvoke(action.EndInvoke, null); 

El método DoSomething() captura todas las excepciones y ofertas con ellos internamente.

¿La llamada al EndInvoke es apropiada? ¿Necesario?

¿Hay una forma más clara de lograr el mismo comportamiento?

Respuesta

4

La forma "vieja escuela" en .NET 3.5 es utilizar el ThreadPool:

ThreadPool.QueueUserWorkItem(s => DoSomething()); 

Si prefiere utilizar delegados asíncronos, entonces debe saber que la llamada al EndInvokees necesaria, incluso si no tiene ningún código adicional que desee ejecutar en la devolución de llamada.

+1

Tu única línea supera a mis dos. –

9

La nueva forma (en .NET 4) es hacer esto:

Task.Factory.StartNew(() => DoSomething()); 
+2

¿Qué pasa con la eliminación del objeto Tarea? Me interesaría tu opinión sobre [esta pregunta] (http://stackoverflow.com/q/3734280/119738) –

5

Debe tenerse en cuenta que Task.Factory.StartNew(() => DoSomething()); no observa ninguna excepción potencial lanzada por el método DoSomething. Sé que esto es lo que uno quiere cuando se inicia una operación de disparar y olvidar, pero en lo que se refiere a .Net 4, cualquier tarea con una excepción no observada finalizada por el recolector de basura escalaría como una excepción no controlada que matará su proceso . Sin embargo, en .Net 4.5, el comportamiento predeterminado ha cambiado (consulte la async & aguarde las palabras clave).

Cuestiones relacionadas