c# - 增加/减少 SemaphoreSlim 中可用插槽的数量

标签 c# .net multithreading

编辑:我的问题,正如最初的措辞,暗示 SemaphoreSlim 创建和销毁线程是不准确的。重新表述为使用“插槽”而不是“线程”,我相信这样更准确。

我使用 SemaphoreSlim 类来控制我访问给定资源的速率,而且效果很好。但是,我正在努力如何动态增加和减少可用插槽的数量。

理想情况下,SemaphoreSlim 将具有具有以下特征的 Increase()Decrease() 方法:

  • Increase() 将可用插槽的最大数量增加 1
  • Decrease() 将可用插槽的最大数量减少 1
  • 这些方法不会等待,它们会立即返回
  • 当达到可配置的最大槽数时,后续调用 Increase() 相当于 noop(不抛出异常)
  • 当达到可配置的最小槽数时,后续调用 Decrease() 相当于 noop(不抛出异常)
  • Decrease() 被调用并且所有插槽都在使用中时,插槽的最大数量会在释放插槽时减少

是否有一个 .NET 构造允许这样的事情?

最佳答案

正如评论中已经提到的,信号量既不创建也不销毁线程。您正在描述并可能正在搜索的是 ThreadPool 的功能类(class)。它有一些方法,比如 SetMinThreads , SetMaxThreads , QueueUserWorkItem并且肯定会完全按照您的意愿行事。

关于c# - 增加/减少 SemaphoreSlim 中可用插槽的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36272389/

相关文章:

c# - .NET 中的并行抓取

.net - 如何在 Azure Function 应用程序中的所有函数中添加点网依赖项

java - 为什么局部变量不允许使用 volatile 关键字?

java - 为什么同步块(synchronized block)比同步方法更好?

c# - ASP.NET MVC C# 在类中获取 Controller 和操作名称

c# - 如何取消任务的继续?

c# - IEnumerable<T>.ToLookup<TKey, TValue>

c# - 从 FirstPersonController 访问另一个脚本

c# - string overload + operator 在哪里进行字符串连接?

multithreading - 如何在不复制所有变量的情况下制作 perl 线程?