嗨,我正在与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个任务排队等待运行,而不是正在运行。那么如何确定运行/可运行任务的数量呢?
答案 0 :(得分:0)
我知道你的帖子已经有一段时间了,但我希望这可以帮助那些面对你特定挑战的人。您的上一条评论指出'DeliverMessage'方法正在发出HTTP请求。
如果您使用“WebClient”对象(例如)发出请求,它将受ServicePointManager.DefaultConnectionLimit属性的约束。这意味着它将最多创建两个(默认情况下)与主机的并发连接。如果您创建了1,000个并行任务,则这两个连接必须为所有这些任务提供服务。
您必须使用此设置的不同值来在应用程序的吞吐量和Web服务器上的负载之间找到适当的平衡。