Multithreading 信号量LIM未旋转到最大线程数

Multithreading 信号量LIM未旋转到最大线程数,multithreading,.net-core,task,semaphore,Multithreading,.net Core,Task,Semaphore,我以为我理解信号量lim,但我想我需要一些帮助。如果我声明了一个maxCount为2的信号量,那么我假设循环中每次调用WaitAsync()都会使信号量最多增加到2,这样一次最多可以运行两个任务,但即使我在每个任务结束时释放信号量,它一次也只能运行一个。有人能解释一下为什么这段代码一次只运行一个任务吗 class Program { static SemaphoreSlim _loopThrottle = new SemaphoreSlim(1, 2); static asyn

我以为我理解信号量lim,但我想我需要一些帮助。如果我声明了一个maxCount为2的信号量,那么我假设循环中每次调用WaitAsync()都会使信号量最多增加到2,这样一次最多可以运行两个任务,但即使我在每个任务结束时释放信号量,它一次也只能运行一个。有人能解释一下为什么这段代码一次只运行一个任务吗

class Program
{
    static SemaphoreSlim _loopThrottle = new SemaphoreSlim(1, 2);

    static async Task Main(string[] args)
    {
        for (int taskID = 1; taskID <= 10; taskID++)
        {
            await _loopThrottle.WaitAsync();
            var t = SomeFunctionAsync(taskID);
        }
        Console.ReadLine();
    }

    private async static Task SomeFunctionAsync(int taskID)
    {
        await Task.Delay(1000);
        Console.WriteLine(taskID);
        _loopThrottle.Release();
    }
}
类程序
{
静态信号量lim _loopThrottle=新信号量lim(1,2);
静态异步任务主(字符串[]args)
{

对于(int taskID=1;taskID您误解了SemaphoreSlim构造函数参数,initialCount应为2。您声称两个可用“插槽”中的一个不可用(您的.CurrentCount在开始时将为1)。由于只剩下一个请求,因此循环无法触发SomeFunctionSync()一次执行一个以上的任务。由于每个任务只释放()一次,因此您永远不会释放已声明为maxCount的两个插槽。

对于此场景,您可以使用单参数构造函数
新信号量lim(2)
这正是我所看到的。如果构造函数的第一个值总是控制允许的最大线程数,那么为什么第二个值实际指定了最大线程数?仍然必须缺少一些简单的东西。关于声明一个可用点,我将参数改为1和5,它仍然只处理一个每次。static SemaphoreSlim\u loopThrottle=new SemaphoreSlim(1,5);通过指定(1,5),您声称最多可以授予五个,但当前只有一个可用,这就是为什么您会看到这种一次一个的行为。每个任务都被前一个任务阻止,而前一个任务只释放一个点。请尝试使用(5,5)它会像预期的那样工作。也许我需要提出不同的问题。如果我使用第二个构造函数,使用两个值(initial和max)(5,5),则使用单个值5声明信号量的行为似乎是相同的。这两个构造函数都是对的,一定有原因吧?从逻辑上讲,我看到了两者的原因。“我可能会有多达5件事情发生,但我可能不会只使用你所需要的数量”,这将是一个1,5组参数。或者,我总是会有一个5件事情在一个时间运行,所以继续前进,并将它们预先声明为5,5)。