C#并行执行线程限制

C#并行执行线程限制,c#,multithreading,concurrency,C#,Multithreading,Concurrency,我正在编写一个简单的测试,它只记录并发请求启动然后休眠一秒钟的时间 static void TestParallelism() { int expectedThreadCount = 100; ThreadPool.SetMaxThreads(Environment.CurrentManagedThreadId, expectedThreadCount); var module = new WCFCompositeModule(); module.Initiali

我正在编写一个简单的测试,它只记录并发请求启动然后休眠一秒钟的时间

static void TestParallelism()
{
    int expectedThreadCount = 100;
    ThreadPool.SetMaxThreads(Environment.CurrentManagedThreadId, expectedThreadCount);
    var module = new WCFCompositeModule();
    module.Initialize(new Keywords());

    var range = Enumerable.Range(0, expectedThreadCount);
    var startTimes = new ConcurrentBag<DateTime>();

    var parallelOptions = new ParallelOptions { MaxDegreeOfParallelism = expectedThreadCount };
    Parallel.ForEach(range, i =>
    {
        startTimes.Add(DateTime.Now);
        Thread.Sleep(1000);
    });

    foreach (var time in startTimes)
    {
        Console.WriteLine(string.Format("{0: HH:mm:ss.fff}", time));
    }

    Console.ReadLine();
}
static void TestParallelism()
{
int expectedThreadCount=100;
SetMaxThreads(Environment.CurrentManagedThreadId,expectedThreadCount);
var module=new WCFCompositeModule();
初始化(新关键字());
变量范围=可枚举的范围(0,expectedThreadCount);
var startTimes=新的ConcurrentBag();
var parallelOptions=new parallelOptions{maxdegreeofpparallelism=expectedThreadCount};
Parallel.ForEach(范围,i=>
{
添加(DateTime.Now);
睡眠(1000);
});
foreach(以startTimes为单位的var时间)
{
WriteLine(string.Format(“{0:HH:mm:ss.fff}”,time));
}
Console.ReadLine();
}
当我使用100个预期线程执行此操作时,我可以看到12个不同的启动时间,它们都以1秒的速度变化。而不是看到他们都在同一秒开始

样品

13:59:27.475 13:59:26.473 13:59:25.473 13:59:24.471 13:59:23.470 13:59:22.469


发生这种情况是因为睡眠阻塞了线程吗

然而,您似乎期望这段代码能够启动100个线程

MaxDegreeOfParallelism = expectedThreadCount 
只设置一个最大值,而不是最小值,系统将把它分派给任意多个(最多是MaxDegreeOfParallelism)线程


除非您有一台100核的机器,否则它不太可能使用100个线程,因此它使用X个线程,然后它们都阻塞1秒,然后在相同的前X个线程上调度下一批。这里x是100/12=8.333333,所以如果你看到12个不同的时间,它会启动至少12个不同的批处理,这意味着它一次执行8到9个线程,如果你有一个带超线程的4核系统或一个8核系统,这可能是默认行为。

当你在没有睡眠的情况下尝试它时发生了什么?没有睡眠,一切都会按预期工作。因此,如果我设置了最小线程数,它会工作,或者因为睡眠仍然会阻塞,我应该看到类似的结果。@johnny5睡眠会阻塞线程调用线程,所以如果有100个线程,每个线程将等待1秒,但这并不意味着它们不能同时启动。但是,没有简单的方法来设置最小值,当您使用TPL时,您让它决定什么是最好的,如果您想要显式控制,请手动创建和管理线程(但除非您有非常特定的工作负载,否则您的性能更可能差于更好)。