c# Process.GetCurrentProcess().Threads.Count 在使用 MaxDegreeOfParallelism 时未返回预期?

标签 c# multithreading

我正在做这样的事情..

Task.Factory.StartNew(() =>{ 
    Parallel.ForEach(list, new ParallelOptions { MaxDegreeOfParallelism = 10 }, (listitem, state) =>
    {
        //do stuff here
        Console.writeln(Process.GetCurrentProcess().Threads.Count);               
    });
});

我的应用程序的线程数总是超过 10 个?限制我的应用程序使用的线程数我做错了什么?

最佳答案

根据 MSDN :

By default, For and ForEach will utilize however many threads the underlying scheduler provides, so changing MaxDegreeOfParallelism from the default only limits how many concurrent tasks will be used.

因此,线程数 将超过 10,但是单次运行的线程不会超过 10 个。这为底层框架节省了跟踪每个线程并向其附加代码的麻烦,如果另一个操作出现故障,则可能会破坏该操作的稳定性。相反,我们发现它会创建任意多个线程并限制一次可以运行的线程数。

您甚至可以通过向类中添加一个计数来测试它,并查看它达到了多高:

// In the class scope
int _count = 0;
int MaxCount = 0;
object key = new object();

int Count
{
    get { lock(key) return _count; }
    set
    {
        lock(key)
        {
            _count = value;
            if(_count > MaxCount) MaxCount = value;
        }
    }
}
...
Task.Factory.StartNew(() =>{ 
    Parallel.ForEach(list, new ParallelOptions { MaxDegreeOfParallelism = 10 }, (listitem, state) =>
    {
        Count++;
        Console.writeln(Process.GetCurrentProcess().Threads.Count);
        Count--;            
    });
});

关于c# Process.GetCurrentProcess().Threads.Count 在使用 MaxDegreeOfParallelism 时未返回预期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26870921/

相关文章:

c# - 从 SQL Server 表中选择 NULL 值

c# - 创建在所有进程之间共享状态的多进程架构的最轻量级解决方案是什么

c# - (C#) 如何读取文件夹中的所有文件以查找特定行?

multithreading - 如何访问当前从用户空间读取/写入的线程数?

java - "Closing"阻塞队列

c++ - 关闭窗口和线程生成无效的窗口句柄错误 - C++

java - 如何检测 Swing 线程策略违规

c# - 服务与程序交互

c# - 什么是休息?

c# - WHERE 上的 SQL Server 查询错误