Task.Factory.StartNew-对池感到困惑

本文关键字:Factory StartNew- Task | 更新日期: 2023-09-27 18:25:47

嗨,我正忙于Task.Factory.StartNew。就在我想到这一点的时候,有人建议我写以下代码;

bool exitLoop = false;                
while (!exitLoop)
{
    exitLoop = true;
    var messages = Queue.GetMessages(20);
    foreach (var message in messages)                    
    {
        exitLoop = false;
        Task.Factory.StartNew(() =>
                    {
                        DeliverMessage(message);
                    });
    }
}

理论上,这将耗尽一个队列,一次20条消息,试图为队列中的每条消息创建一个Task。因此,如果我们的队列中有1000条消息,那么在一瞬间我们就会有25个任务,它会吃掉所有的消息。我以前认为我理解这一点,我认为StartNew一旦条目用完就会被屏蔽——在过去,这大约是25个。但考虑到这个是.net 4.5,我现在的印象是,游泳池的上限现在很高。令我困惑的是,我本以为这会让新任务充斥整个池,并开始阻塞,也就是说,在一瞬间,我现在有1000个任务在运行。那么,如果池限制现在几乎不是限制,为什么我看不到1000个任务?

[编辑]好的,我看到的是1000个任务排队等待运行,而不是正在运行。那么,我该如何确定正在运行/可运行任务的数量呢?

Task.Factory.StartNew-对池感到困惑

我知道这是在你的帖子发布后很长一段时间,但我希望这可能会帮助面临你特定挑战的人。您的上一条评论指出"DeliverMessage"方法正在发出HTTP请求。

如果您正在使用"WebClient"对象(例如)进行请求,它将被ServicePointManager.DefaultConnectionLimit属性绑定。这意味着它最多将创建两个(默认情况下)到主机的并发连接。如果您创建了1000个并行任务,那么所有1000个任务都必须由这两个连接提供服务。

为了在应用程序的吞吐量和web服务器上的负载之间找到正确的平衡,您必须对该设置使用不同的值。