[英]Difference between delegate.BeginInvoke and using ThreadPool threads in C#
[英]Delegate.BeginInvoke vs ThreadPool.QueueWorkerUserItem
public void BeforeSendReply(ref Message reply, object correlationState)
{
var replyCopy = reply;
ThreadPool.QueueUserWorkItem(delegate
{
RequestQueueHandler.RequestQueue.Add((Message)correlationState, replyCopy);
});
}
VS
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,但我不知道哪一个实际上更好,在这种情况下也不是一般的
UPDATE
我读了一些关于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的优点是简单。
看看这本优秀的在线书籍 ,深入讨论这两种(和更多)方法。
作为一个拇指的规则:
ThreadPool.QueueWorkerUserItem
是更高级别和首选。 但是场景后面的 但ThreadPool.QueueWorkerUserItem
使用Delegate.BeginInvoke
。Delegate.BeginInvoke
使用ThreadPool
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.