0

0

c# 在 .NET 中,一个进程最多可以创建多少个线程

月夜之吻

月夜之吻

发布时间:2026-01-24 09:43:34

|

951人浏览过

|

来源于php中文网

原创

.NET线程数无硬编码上限,实际受限于操作系统内存与内核对象;默认1MB栈空间导致32位进程约2000线程即OOM,64位受物理内存与页表限制;应优先使用async/await和ThreadPool而非手动创建大量Thread。

c# 在 .net 中,一个进程最多可以创建多少个线程

线程数受操作系统和内存限制,不是 .NET 硬编码上限

.NET 本身不设固定线程数量上限,ThreadPool 默认最大线程数由 ThreadPool.GetMaxThreads 返回,但这个值只是线程池的“软限制”,实际能创建多少个 Thread 实例,取决于 Windows(或 Linux/macOS)能为该进程分配多少空间和内核对象。

每个线程默认占用 1MB 栈空间,内存很快见底

在 Windows 上,.NET 的 Thread 默认栈大小是 1 MB(x64 进程),哪怕只调用 new Thread(() => {}).Start(),也会立即向进程地址空间申请这块保留内存(commit 按需)。32 位进程用户态地址空间仅约 2GB,理论上撑不过 2000 个线程;64 位进程虽大得多,但物理内存和页表开销会先成为瓶颈。常见现象是:创建几百个线程后,OutOfMemoryExceptionThread.Start() 抛出 InvalidOperationException(内部触发 ERROR_NOT_ENOUGH_MEMORY)。

  • Thread 构造时可通过 new Thread(..., stackSize) 指定更小栈(如 256 * 1024),但低于 128KB 可能导致 StackOverflow
  • 频繁创建/销毁线程比复用 ThreadPoolTask 开销大得多,且易触发 GC 压力
  • Windows 内核对每个进程的线程句柄数也有默认限制(通常 2000–4000),可通过 SetProcessInformation 调整,但极少需要

别硬扛线程数,改用异步 I/O 和 Task 调度

真正需要“高并发”的场景(如万级连接的服务器),几乎从不依赖大量 Thread 实例。正确做法是:用 async/await + SocketAsyncEventArgs(或 System.Net.Sockets.Socket 的异步方法),让单线程处理数百连接;CPU 密集任务则交由 Task.Run 并依赖 ThreadPool 自动伸缩(其最大线程数默认为 Environment.ProcessorCount * 100,但会按负载动态调整)。

千博购物系统.Net
千博购物系统.Net

千博购物系统.Net能够适合不同类型商品,为您提供了一个完整的在线开店解决方案。千博购物系统.Net除了拥有一般网上商店系统所具有的所有功能,还拥有着其它网店系统没有的许多超强功能。千博购物系统.Net适合中小企业和个人快速构建个性化的网上商店。强劲、安全、稳定、易用、免费是它的主要特性。系统由C#及Access/MS SQL开发,是B/S(浏览器/服务器)结构Asp.Net程序。多种独创的技术使

下载
var tasks = Enumerable.Range(0, 10000)
    .Select(_ => Task.Run(() => HeavyComputation()))
    .ToArray();
await Task.WhenAll(tasks); // 实际并发执行数远小于 10000,由线程池控制

检查当前限制和实际使用量的方法

运行时可快速验证当前环境约束:

  • 查线程池上限:ThreadPool.GetMaxThreads(out int workerThreads, out int completionPortThreads)
  • 查已启动线程数(粗略):Process.GetCurrentProcess().Threads.Count(注意:包含调试器、GC、JIT 等后台线程)
  • 观察私有字节(Private Bytes)增长:每新增一个默认栈线程,进程内存上升约 1MB(保留区)

真要突破几百线程,先确认是否误用了同步阻塞模型——这是绝大多数“需要更多线程”诉求的根源。

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

198

2023.11.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

358

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

542

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

53

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

394

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

574

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

482

2023.08.10

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.7万人学习

Git 教程
Git 教程

共21课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号