AutoResetEvent 等待线程数.net 5.0
Posted
技术标签:
【中文标题】AutoResetEvent 等待线程数.net 5.0【英文标题】:AutoResetEvent number of waiting threads .net 5.0 【发布时间】:2021-10-20 10:33:59 【问题描述】:我正在使用 AutoResetEvent。 我只需要知道是否可以获得等待线程的数量?
if (WaitHandler.Reset())
if (WaitHandler.WaitOne(WaitMilliseconds))
// do something after WaitHandler.Set()
我需要知道 WaitOne() 中当前有多少线程在等待。是否可以限制它们,比如最多 10 个线程 - 所有其他线程都返回?如果没有 - 如何限制它?
【问题讨论】:
你在找SemaphoreSlim或Semaphore类吗? @Steeeve Semaphore 在这种情况下看起来不错。我会检查的。谢谢 @Steeeve 不,我正在寻找不同的东西。信号量限制了可以同时访问资源或资源池的线程数。但我需要阻塞所有线程(最多 10 个),直到另一个线程(和方法)发生某些事情 【参考方案1】:我不确定这是否有用,我在 https://kmyr.dev/post/limiting-the-number-of-threads 找到了它
internal sealed class ThreadManager
private readonly WaitHandle[] _syncObjects;
public ThreadManager() : this(Environment.ProcessorCount)
public ThreadManager(int maxThreads)
MaxThreads = maxThreads;
_syncObjects = new WaitHandle[maxThreads];
for (var i = 0; i < maxThreads; i++)
_syncObjects[i] = new AutoResetEvent(true);
public int MaxThreads get; private set;
public bool StartTask(Action action, bool wait)
var timeout = wait ? Timeout.Infinite : 0;
var freeIndex = WaitHandle.WaitAny(_syncObjects, timeout);
if (freeIndex == WaitHandle.WaitTimeout)
return false;
ThreadPool.QueueUserWorkItem(
state =>
action();
((AutoResetEvent)state).Set();
,
_syncObjects[freeIndex]);
return true;
【讨论】:
以上是关于AutoResetEvent 等待线程数.net 5.0的主要内容,如果未能解决你的问题,请参考以下文章