你好,我正在使用不同的 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 会经常更改。
关于c# - 具有 MaxDegreeOfParallelism 和实际线程数的 ParallelOptions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64671405/