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
- necesidad de notificación a través de devolución de llamada delegado/Llamada de nuevo en devolución de llamada
- Evitar el hilo de arriba, (delegados sirven de hilos Threadpool)
- 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.
- ¿Hay alguna otra razón?
- ¿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 ?
@ 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 –
@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. –
@ 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. –