public void BeforeSendReply(ref Message reply, object correlationState)
{
var replyCopy = reply;
ThreadPool.QueueUserWorkItem(delegate
{
RequestQueueHandler.RequestQueue.Add((Message)correlationState, replyCopy);
});
}
vsDelegate.BeginInvoke vs ThreadPool.QueueWorkerUserItem
private delegate void RequestQueueHandlerAdd(Message request, Message reply);
private static void AsyncMethod(Message request, Message reply)
{
RequestQueueHandler.RequestQueue.Add(request, reply);
}
public void BeforeSendReply(ref Message reply, object correlationState)
{
((RequestQueueHandlerAdd)AsyncMethod).BeginInvoke((Message)correlationState, reply, null, null);
}
cuál de los dos debería usar? (¿Qué funciona mejor?) ¿por qué?
¿La sobrecarga de mi método influye en la decisión o una de estas implementaciones siempre supera a la otra?
¿por qué?
estoy inclinado hacia ThreadPool.QueueWorkerUserItem pero no tengo ni idea de cuál es realmente mejor, ni en este caso ni en general
ACTUALIZACIÓN
He leído algunas cosas sobre TPL .. trabajado esto fuera:
public void BeforeSendReply(ref Message reply, object correlationState)
{
var replyCopy = reply;
var enqueue = Task.Factory.StartNew(() => RequestQueueHandler.RequestQueue.Add((Message)correlationState, replyCopy));
}
¿cómo se supone que debo manejar la excepción aquí? Quiero decir, si lo hago
public void BeforeSendReply(ref Message reply, object correlationState)
{
var replyCopy = reply;
var enqueue = Task.Factory.StartNew(() => RequestQueueHandler.RequestQueue.Add((Message) correlationState, replyCopy));
**try
{
enqueue.Wait();
}
catch(AggregateException e)
{
Handle(e);
}**
}
¿No me falta aquí todo el punto de paralelismo?
¿No debería simplemente manejar la posible excepción lanzar en el método RequestQueueHandler.RequestQueue.Add
?
¿Qué versión de .NET estás usando? Si está en .NET 4, debe usar la Biblioteca de tareas paralelas. Bueno, no "debería", sino "muy alentado". – Tejs
Estoy usando Framework 4.0, ¿podría ampliarlo, quizás publicarlo como respuesta? – bevacqua