【问题标题】:AutoResetEvent number of waiting threads .net 5.0AutoResetEvent 等待线程数.net 5.0
【发布时间】:2021-10-20 10:33:59
【问题描述】:

我正在使用 AutoResetEvent。 我只需要知道是否可以获得等待线程的数量?

if (WaitHandler.Reset())
{
     if (WaitHandler.WaitOne(WaitMilliseconds))
     {
         // do something after WaitHandler.Set()  
     }
}

我需要知道 WaitOne() 中当前有多少线程在等待。是否可以限制它们,比如最多 10 个线程 - 所有其他线程都返回?如果没有 - 如何限制它?

【问题讨论】:

  • 你在找SemaphoreSlimSemaphore类吗?
  • @Steeeve Semaphore 在这种情况下看起来不错。我会检查的。谢谢
  • @Steeeve 不,我正在寻找不同的东西。信号量限制了可以同时访问资源或资源池的线程数。但我需要阻塞所有线程(最多 10 个),直到另一个线程(和方法)发生某些事情

标签: c# .net multithreading .net-core


【解决方案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;
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    相关资源
    最近更新 更多