c# - 具有 MaxDegreeOfParallelism 和实际线程数的 ParallelOptions

标签 c# .net multithreading parallel-processing console-application

你好,我正在使用不同的 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;
}

输出:

enter image description here

最佳答案

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/

相关文章:

C++队列多线程等待作业完成

c - 树莓派上的 SDL 1.2 出现奇怪的线程死锁

c# - 如何复制 Excel 绘制 "Scatter with smooth lines"图形的操作

c# - 类库错误不包含适合入口点的静态方法 'Main'

c# - 调用 Assembly.ReflectionOnlyLoadFrom 时出现 System.PlatformNotSupportedException 异常

c# - string.Join - "cannot convert from IEnumerable to string[]"

c# - SqlBulkCopy 到 Sql Server 2008 中的临时表

.net - 有谁知道 ASP.NET MVC 何时会完全发布?

c# - 用于为 Web 应用程序实现文档编辑和查看功能的 API?

multithreading - 这种解决竞争状况的解决方案是什么?