2012-07-13 15 views
7

Reemplazo de subprocesos (no subproceso de subprocesamiento de subprocesos) con delegados asincrónicos (devoluciones de llamada).Delegados asíncronos frente a subprocesos

Mi escenario: generar un subproceso/del.beginInvoke() por cliente.

Según yo,

Razones

  1. necesidad de notificación a través de devolución de llamada delegado/Llamada de nuevo en devolución de llamada
  2. Evitar el hilo de arriba, (delegados sirven de hilos Threadpool)
  3. argumentos para el traspaso (Evita Casting to object) y necesita un valor de retorno del método.

Corrígeme si los motivos anteriores son incorrectos.

  1. ¿Hay alguna otra razón?
  2. ¿En qué situación exactamente necesito hacer algunas cosas con los delegados asíncronos que los hilos no pueden?
    3.Performance?

Ejemplo

public delegate void SendCallbackType(); 

    SendCallbackType senderdel= new SendCallbackType(SendData); 

    public void StartSend() // This method Could be Called more than 700 times (Thread per Client) 
    { 
     senderdel.BeginInvoke(SendCallback,null); 
        // (or) 
     Thread t = new Thread(new ThreadStart(ThreadSend)); 
     t.IsBackground = true; 
     t.Start(); 
    } 

    //Async Delegate 
    void SendData() 
    { 
     string data = QueData.DeQueue(); 
     RaiseOnData(data); // Raise to event. 
    } 
    void SendCallback(IAsyncResult ar) 
    { 
     senderdel.BeginInvoke(SendCallback, null); 
    } 

//Thread 
    void ThreadSend() 
    { 
     while (true) 
     { 
     string data = QueData.DeQueue(); 
     RaiseOnData(data); // Raise to event. 
     } 
    } 

De lo anterior qué opción sería la mejor. Actuación ?

Respuesta

10

Su razonamiento es correcto. Los delegados asíncronos usan subprocesos del grupo de subprocesos, por lo que deberían ser más rápidos en comparación con la creación manual de subprocesos. Tenga cuidado sin embargo con esto en las aplicaciones ASP.NET. Debido a que consumirá subprocesos de trabajo que ASP.NET utiliza normalmente para las solicitudes de servicio, es posible que su aplicación se quede sin capacidades de servicio.

Los delegados asincrónicos son adecuados para tareas intensivas de CPU. Para tareas intensivas de E/S (como leer transmisiones, llamadas a bases de datos y llamadas al servicio web), debe utilizar los métodos BeginXXX, EndXXX ofrecidos directamente por las clases correspondientes (Stream, SqlConnection, WebClient, ...). De esta forma, no está utilizando ningún subproceso durante la operación de E/S prolongada. Está utilizando I/O Completion Ports que es lo mejor en términos de tareas vinculadas de E/S. Serán órdenes de magnitud más efectivas y más baratas en recursos que cualquier subproceso y grupo de subprocesos.

Entonces, para resumir:

  • para las tareas intensivas de E/S utilizan E/S puertos de finalización. Si la tarea intensiva de E/S está dentro de una biblioteca mal escrita que no ofrece esta posibilidad, use el TPL que se introdujo en .NET 4.0.
  • Para tareas intensivas de CPU use el TPL que se introdujo en .NET 4.0.

Y si no tiene .NET 4.0 utilice el grupo de subprocesos a menos que esté escribiendo una aplicación ASP.NET, en cuyo caso puede recurrir a la creación manual de subprocesos.

En general, es una buena práctica comenzar a usar TPL y orientar sus métodos como tareas para que esté listo para .NET 4.5 que introduce las palabras clave async/await.

+0

@ Darin: Gracias por la respuesta.Aquí el caso es la aplicación de Windows, creo que solo tareas intensivas de CPU, ¿qué pasa con el rendimiento al generar 1000 hilos vs 1000 del.begininvoke() llame al –

+0

@MSK, definitivamente vaya con TPL en este caso y si está utilizando una versión anterior de. NET usa el grupo de subprocesos (ThreadPool, BackgroundWorker, delegados Async, ... => todos terminarán en el ThreadPool de todos modos). No genere hilos manualmente en esta situación. –

+0

@ Darin: Y yo no necesito Fuego y lo olvido. Aquí estoy necesitando un hilo dedicado para dequeue (independientemente de ThreadPool) y al mismo tiempo es un proceso de larga ejecución. –

Cuestiones relacionadas