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 vs ThreadPool.QueueWorkerUserItem

Delegate.BeginInvoke()方法也使用ThreadPool,所以不要期望在性能上有任何有意义的差异。

QueueUserWorkItem()并不直接更好,只是在大多数情况下更容易。

但请注意,这两个示例都缺少错误处理。
你漂亮的短委托需要一个try/catch, BeginInvoke场景需要一个Callback。

所以当你可以使用Fx4时,你应该使用更高抽象级别的TPL

异步委托给您更多:返回值和异常转发(您应该调用EndInvoke来访问它们)。通过直接使用ThreadPool,你必须自己处理这个问题。

另一方面,ThreadPool的优点是简单。

一定要看看这本优秀的在线书,它深入讨论了两种(以及更多)方法。

根据经验:

    使用TPL
  • 如果不直接使用ThreadPool来完成简单的即发即忘任务
  • 如果不使用异步委托

ThreadPool.QueueWorkerUserItem级别较高,优先考虑。但是ThreadPool.QueueWorkerUserItem在后台使用Delegate.BeginInvoke但是Delegate.BeginInvoke使用来自ThreadPool的线程。

相关文章:
  • 没有找到相关文章