1

嗨,我正忙于 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 条消息,尝试为队列中的每条消息创建一个任务。因此,如果我们在队列中有 1000 条消息,那么瞬间我们就会有 25 个任务,它会吃掉所有的消息。我以前认为我理解这一点,我认为 StartNew 一旦条目用完就会阻止 - 在过去应该是 ~ 25。但鉴于这是 .net 4.5,我现在的印象是上限一个游泳池现在相当高。令我困惑的是,我会假设新任务将淹没池并开始阻塞,即瞬间我现在有 1000 个任务在运行。因此,如果池限制现在几乎不是限制,为什么我看不到 1000 个任务?

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

4

1 回答 1

0

我知道这是在您发布帖子之后的一段时间,但我希望这可以帮助面临您特定挑战的人。您的最后一条评论指出“DeliverMessage”方法正在发出 HTTP 请求。

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

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

于 2014-07-17T16:47:37.750 回答