繁体   English   中英

Delegate.BeginInvoke vs ThreadPool.QueueWorkerUserItem

[英]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的优点是简单。

看看这本优秀的在线书籍 ,深入讨论这两种(和更多)方法。

作为一个拇指的规则:

  • 如果可以,请使用TPL
  • 如果不直接使用ThreadPool进行简单的即发即弃任务
  • 如果不使用异步委托

ThreadPool.QueueWorkerUserItem是更高级别和首选。 但是场景后面的ThreadPool.QueueWorkerUserItem使用Delegate.BeginInvoke Delegate.BeginInvoke使用ThreadPool

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM