讲师中心 微信公众号
AI工具推荐 视频效率加速

C#怎么使用SemaphoreSlim C#限制并发线程数量方法

阿敏君_5971

阿敏君_5971

发布时间:2025-12-21 08:21:08

|

917人浏览过

|

来源于php中文网

原创

SemaphoreSlim 是 C# 中专为异步设计的轻量信号量,通过 WaitAsync() 和 Release() 控制并发,需用 try/finally 确保释放,不支持 using,适用于单进程内限流。

c#怎么使用semaphoreslim c#限制并发线程数量方法

SemaphoreSlim 是 C# 中轻量级的信号量实现,专为异步场景设计,适合控制并发访问资源的线程/任务数量。它比传统的 Semaphore 更高效(不依赖操作系统内核),且原生支持 async/await。

初始化并设置最大并发数

构造函数接收两个参数:初始可进入数(通常等于最大并发数)、最大允许数。

  • 比如限制最多 3 个任务同时执行: var semaphore = new SemaphoreSlim(3, 3);
  • 第一个参数是“当前可用许可数”,第二个是“上限”,两者相等表示初始全空闲
  • 若设为 new SemaphoreSlim(0, 3),则初始无人能进入,需手动 Release() 才能开始

在异步方法中安全获取和释放许可

务必用 await WaitAsync() 获取许可,用 Release() 归还(不能用 await ReleaseAsync(),它不存在)。

redis-tools
redis-tools

按类别查找Redis命令、检测服务器连接、监控键数量和内存占用,支持离线速查表。

下载
  • 推荐写法(自动释放,防遗漏):
await semaphore.WaitAsync();
try
{
    // 执行受控操作,如调用 API、处理文件等
    await DoWorkAsync();
}
finally
{
    semaphore.Release(); // 必须确保执行到
}
  • 别用 using —— SemaphoreSlim 不实现 IDisposable(仅当需要释放底层资源时才调用 Dispose(),一般不用)
  • 避免在 catch 块外直接 Release(),否则异常时会漏释放,导致许可永久丢失

配合 Task.WhenAll 控制批量任务并发

常见需求:启动 100 个 HTTP 请求,但只允许最多 5 个并发。

  • 把所有任务拆成小批次,或用循环 + WaitAsync 控制节奏
  • 简洁做法(逐个提交,内部限流):
var tasks = urls.Select(async url =>
{
    await semaphore.WaitAsync();
    try
    {
        return await client.GetStringAsync(url);
    }
    finally
    {
        semaphore.Release();
    }
});
await Task.WhenAll(tasks);
  • 注意:上面写法本质是“启动 100 个任务,但每个都先抢许可”,实际并发仍可控
  • 如果想更明确分批(如每批 5 个),可用 Chunk() + Task.WhenAll 嵌套

其他实用细节

  • WaitAsync() 可传入 CancellationToken,支持取消等待(比如超时或用户中止)
  • CurrentCount 属性可读取当前剩余许可数(仅作监控,非原子判断依据)
  • 不要在同步方法里用 Wait() 阻塞等待 —— 容易引发死锁,尤其在 UI 或 ASP.NET 同步上下文中
  • 若需跨进程或跨 AppDomain 限流,SemaphoreSlim 不适用,得换 Semaphore 或分布式方案(如 Redis 信号量)

基本上就这些。SemaphoreSlim 不复杂但容易忽略释放和异常路径,只要守好“try/finally + Release”这个模式,就能稳稳控住并发量。

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

2093

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

3294

2023.10.07

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

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

4398

2023.08.10

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4649

2023.11.02

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4215

2023.11.14

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

7932

2024.04.02

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

643

2024.04.07

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

776

2024.04.07

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn