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的主要内容,如果未能解决你的问题,请参考以下文章

线程同步之-旋转门AutoResetEvent

AutoResetEvent类的使用

C# 线程间互相通信

可等待的 AutoResetEvent

在 C# 中异步等待继续后的实时 AutoResetEvent

多个线程等待一个事件?