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

C# Task.Factory.StartNew-对池感到困惑,c#,multithreading,threadpool,C#,Multithreading,Threadpool,嗨,我正忙于任务。工厂。开始新的。正如我想我知道的那样,有人建议我编写以下代码 bool exitLoop = false; while (!exitLoop) { exitLoop = true; var messages = Queue.GetMessages(20); foreach (var message in messages) { exitLoop = false

嗨,我正忙于任务。工厂。开始新的。正如我想我知道的那样,有人建议我编写以下代码

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个任务,它将吃掉所有的MSG。我以前认为我理解这一点,我认为StartNew在没有条目时会被阻止——在过去,它应该是~25条。但考虑到这是.NET4.5,我现在的印象是,池的上限现在相当高。让我困惑的是,我本以为会有大量新任务涌入池中并开始阻塞,即在一瞬间,我现在有1000个任务正在运行。因此,如果池限制现在几乎不是一个限制,为什么我没有看到1000个任务

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

我知道这是你发表文章后的一段时间,但我希望这可能会帮助一些人面对你的特定挑战。您上次的评论指出“DeliverMessage”方法正在进行HTTP请求

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


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

Task.Factory将立即或在计划程序找到可用线程时执行其队列中的每个任务。另外,在使用StartNew方法时,您需要传递取消令牌,以避免GC导致任务意外终止。我不知道如何确定正在运行/可运行任务tho的数量。而且我忘了提到,任务池不会锁定任何东西,这就是为什么会有一个任务调度器。你想知道当前正在运行的任务的数量,或者是否有任何任务没有完成?基本上,我只是想找到一种最佳的方式来交付1000个MSG,因为读取一个MSG需要花费C。所以通过使用并发性,我希望得到比1000C更好的结果