C#:睡一根线挡住别人?

C#:睡一根线挡住别人?,c#,multithreading,C#,Multithreading,我有C#、.NET4.0和Windows7中的下一个代码 class Program { static void Main(string[] args) { DateTime startTime = DateTime.Now; Parallel.For(1, 100, ind => { System.Console.WriteLine("IND => " + ind + "; DEMORA: " + (DateTime.

我有C#、.NET4.0和Windows7中的下一个代码

class Program
{
    static void Main(string[] args) {
        DateTime startTime = DateTime.Now;
        Parallel.For(1, 100, ind => {
            System.Console.WriteLine("IND => " + ind + "; DEMORA: " + (DateTime.Now - startTime).TotalMilliseconds);
            Thread.Sleep(1000);
        });
        Console.Write("\nPresione una tecla para finalizar...");
        Console.ReadKey(true);
    }
}
该代码的输出类似于此:

IND => 8; DEMORA: 6001,9531
IND => 31; DEMORA: 6002,9297
IND => 55; DEMORA: 6006,8359
IND => 12; DEMORA: 6008,789
IND => 80; DEMORA: 6009,7656
IND => 57; DEMORA: 6009,7656
IND => 79; DEMORA: 6010,7422
IND => 34; DEMORA: 6011,7187
IND => 16; DEMORA: 6010,7422
IND => 19; DEMORA: 7001,9531
IND => 35; DEMORA: 7002,9297
IND => 59; DEMORA: 7006,8359
IND => 43; DEMORA: 7008,789
IND => 81; DEMORA: 7009,7656
IND => 58; DEMORA: 7010,7422
IND => 67; DEMORA: 7011,7187
IND => 83; DEMORA: 7011,7187
IND => 17; DEMORA: 7012,6953
IND => 20; DEMORA: 8001,9531
IND => 36; DEMORA: 8002,9297
IND => 60; DEMORA: 8006,8359
IND => 44; DEMORA: 8008,789
IND => 82; DEMORA: 8009,7656
IND => 71; DEMORA: 8009,7656
IND => 72; DEMORA: 8010,7422
IND => 68; DEMORA: 8011,7187
IND => 84; DEMORA: 8011,7187
IND => 18; DEMORA: 8012,6953
如您所见,该程序每秒运行9,10个线程(大约)。我不明白这是为什么。我知道阻塞线程不应该影响其他线程的执行。因此,问题不应该是调用Thread.Sleep

但是,如果删除“Thread.Sleep(1000)”行,则会得到以下输出:

IND => 78; DEMORA: 20,5078
IND => 79; DEMORA: 21,4844
IND => 69; DEMORA: 18,5547
IND => 53; DEMORA: 19,5312
IND => 97; DEMORA: 20,5078
IND => 80; DEMORA: 24,414
IND => 9; DEMORA: 13,6719
IND => 70; DEMORA: 26,3672
IND => 10; DEMORA: 29,2969
IND => 11; DEMORA: 29,2969
IND => 12; DEMORA: 30,2734
IND => 13; DEMORA: 30,2734
IND => 14; DEMORA: 31,25
IND => 15; DEMORA: 32,2265
IND => 71; DEMORA: 29,2969
IND => 72; DEMORA: 32,2265
这个输出和我预期的一样

有什么解释吗

谢谢,
关于

您正在分别休眠每个线程。

您正在分别休眠每个线程。

任务并行库不会立即启动线程。它将根据CPU的数量安排在现有线程上的执行或创建新线程。因此,在您的计算机上,任务并行库似乎将使用10个线程,并将您的任务安排为使用这些线程。

任务并行库不会立即启动线程。它将根据CPU的数量安排在现有线程上的执行或创建新线程。因此,在您的计算机上,任务并行库似乎将使用10个线程,并安排您的任务使用这些线程。

谢谢。那么,我必须假设在具有4核CPU的win7中,应用程序的最大线程数是10?我可以配置这个吗?我不认为它是那么简单。我认为,由于睡眠代码,TPL最多可以运行10个任务。对于如何执行任务的更多配置,您需要创建一个感谢。然后,我必须假设在具有4核CPU的win7中,应用程序的最大线程数是10?我可以配置这个吗?我不认为它是那么简单。我认为,由于睡眠代码,TPL最多可以运行10个任务。对于如何执行任务的更多配置,您需要创建一个线程池,因为它肯定会影响其他线程的执行,线程池调度程序的任务是确保不会有太多的线程同时运行,并且如果线程没有及时完成,则会调度额外的线程(超出您拥有的内核数量)。NET 4I中添加了一个自动调整算法,将上述代码更改为添加逻辑以计算并发运行的最大线程数。如果我增加睡眠时间,并发线程的数量也会增加。我还注意到,线程的开始以1秒(大约1秒)的固定间隔以3-10为一组。我可以改变这种行为吗?它肯定会影响其他线程的执行,线程池调度程序的任务是确保不会有太多的线程同时运行,并且如果线程不能及时完成,会调度额外的线程(超出您拥有的核心数)。NET 4I中添加了一个自动调整算法,将上述代码更改为添加逻辑以计算并发运行的最大线程数。如果我增加睡眠时间,并发线程的数量也会增加。我还注意到,线程的开始以1秒(大约1秒)的固定间隔以3-10为一组。我可以改变这个行为吗?是的,但是我不睡眠运行其他线程的线程。然后主线程应该在任何结束之前启动所有线程(可能),对吗?@RemeR:TPL使用线程池;它不会启动100个线程。相反,它会重用现有线程来处理其余的项目。打印
Thread.CurrentThread.ManagedThreadId
,看看它是如何工作的。是的,但我不睡眠运行其他线程的线程。然后主线程应该在任何结束之前启动所有线程(可能),对吗?@RemeR:TPL使用线程池;它不会启动100个线程。相反,它会重用现有线程来处理其余的项目。同时打印
Thread.CurrentThread.ManagedThreadId
以查看其工作原理。