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

时间:2013-08-01 15:48:23

标签: c# multithreading threadpool

嗨,我正在与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个任务排队等待运行,而不是正在运行。那么如何确定运行/可运行任务的数量呢?

1 个答案:

答案 0 :(得分:0)

我知道你的帖子已经有一段时间了,但我希望这可以帮助那些面对你特定挑战的人。您的上一条评论指出'DeliverMessage'方法正在发出HTTP请求。

如果您使用“WebClient”对象(例如)发出请求,它将受ServicePointManager.DefaultConnectionLimit属性的约束。这意味着它将最多创建两个(默认情况下)与主机的并发连接。如果您创建了1,000个并行任务,则这两个连接必须为所有这些任务提供服务。

您必须使用此设置的不同值来在应用程序的吞吐量和Web服务器上的负载之间找到适当的平衡。