Delegate.BeginInvoke vs ThreadPool.QueueWorkerUserItem
本文关键字:QueueWorkerUserItem ThreadPool vs BeginInvoke Delegate | 更新日期: 2023-09-27 17:50:41
public void BeforeSendReply(ref Message reply, object correlationState)
{
var replyCopy = reply;
ThreadPool.QueueUserWorkItem(delegate
{
RequestQueueHandler.RequestQueue.Add((Message)correlationState, replyCopy);
});
}
和
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);
}
我应该使用哪一个?(哪个性能更好?)为什么?
我的方法的开销是否会影响决策,或者这些实现中的一个是否总是优于另一个?
为什么?
我倾向于ThreadPool。QueueWorkerUserItem但我不知道哪一个实际上更好,无论是在这种情况下还是在一般
我读了一些关于TPL的文章。算出来了:
public void BeforeSendReply(ref Message reply, object correlationState)
{
var replyCopy = reply;
var enqueue = Task.Factory.StartNew(() => RequestQueueHandler.RequestQueue.Add((Message)correlationState, replyCopy));
}
我应该如何处理这里的异常?我的意思是,如果我做
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);
}**
}
我是不是错过了并行的全部意义?
我不应该处理RequestQueueHandler.RequestQueue.Add
方法中可能抛出的异常吗?
Delegate.BeginInvoke()
方法也使用ThreadPool,所以不要期望在性能上有任何有意义的差异。
QueueUserWorkItem()
并不直接更好,只是在大多数情况下更容易。
但请注意,这两个示例都缺少错误处理。
你漂亮的短委托需要一个try/catch, BeginInvoke场景需要一个Callback。
所以当你可以使用Fx4时,你应该使用更高抽象级别的TPL
异步委托给您更多:返回值和异常转发(您应该调用EndInvoke来访问它们)。通过直接使用ThreadPool,你必须自己处理这个问题。
另一方面,ThreadPool的优点是简单。一定要看看这本优秀的在线书,它深入讨论了两种(以及更多)方法。
根据经验:
- 使用TPL
- 如果不直接使用ThreadPool来完成简单的即发即忘任务
- 如果不使用异步委托
ThreadPool.QueueWorkerUserItem
级别较高,优先考虑。但是但是ThreadPool.QueueWorkerUserItem
在后台使用Delegate.BeginInvoke
。Delegate.BeginInvoke
使用来自ThreadPool
的线程。