具有 MaxDegreeOfParallelism 和实际线程数的 ParallelOptions

ParallelOptions with MaxDegreeOfParallelism and actual number of threads

你好,我正在使用 MaxDegreeOfParallelism 方法的不同值进行“动态”多线程处理,但是每当我尝试更改大于 1 的 MaxDegreeOfParallelism 值时,它会在控制台中显示该程序使用更多线程比我分配的。

public static string DoMultipleTasks(int threads, List<string> inputList)
{            
    ParallelOptions po = new ParallelOptions();          
    po.MaxDegreeOfParallelism = threads;
    Parallel.ForEach(inputList, po,  values =>
    {
        Console.WriteLine(" Name: {0}, Thread Id= {1}", values, Thread.CurrentThread.ManagedThreadId);
    });            
    return null;
}

输出:

MaxDegreeOfParallelism 指定有多少个线程(或更确切地说,任务)可以同时 运行。它没有指定应该是哪些线程。

来自docs

Gets or sets the maximum number of concurrent tasks enabled by this ParallelOptions instance.

在执行 Parallel.ForEach 期间,您可能 运行 在许多不同的线程上(因此涉及许多不同的线程 ID)。这取决于底层线程调度程序。

但是,您可以保证您的代码块最多同时执行 MaxDegreeOfParallelism 次。

虽然您基本上已经有了一个示例,但这里是您的代码的一个稍微修改的版本,以说明我的意思。

var dict = new ConcurrentDictionary<int, string>();
var po = new ParallelOptions { MaxDegreeOfParallelism = 3 };
int count = 0, maxval = 0;
Parallel.ForEach(Enumerable.Range(1, 10000000), po, (d) =>
{
    Interlocked.Increment(ref count);
    dict.AddOrUpdate(Thread.CurrentThread.ManagedThreadId, "", (id, old) => old);

    lock (dict)
    {
        maxval = Math.Max(maxval, count);
    }
    Interlocked.Decrement(ref count);
});

Console.WriteLine("Count: " + count);
Console.WriteLine("Max: " + maxval);
Console.WriteLine("Thread ids: " + String.Join(", ", dict.Select(d => d.Key)));

它应该产生类似这样的输出:

Count: 0
Max: 3
Thread ids: 1, 4, 5, 6, 7, 8, 9

无论您运行此代码多少次,最大值都不应超过 3。另一方面,线程 ID 会经常更改。