为什么这个SemaphoreSlim无限期地等待?

问题描述 投票:0回答:2
using System;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            Task.Run(Test);
            Console.ReadKey();
        }

        public static async Task Test()
        {
            var semahore = new SemaphoreSlim(0, 1);
            Console.WriteLine("before");
            await semahore.WaitAsync();
            Console.WriteLine("after");
        }
    }
}

我创建了一个信号量,限制为1,当前值为0。它应该允许1个线程通过,对吧?为什么在这个例子中没有?

c# .net asynchronous async-await
2个回答
21
投票

我创建了一个信号量,限制为1,当前值为0。它应该允许1个线程通过,对吧?

否 - 当前值为 0,与您所写的完全相同。

信号量值在等待时会向下计数 - 该计数实际上是“可获取的令牌数量”。来自文档

每次线程进入信号量时计数都会递减,每次线程释放信号量时计数都会递增。要输入信号量,线程调用

Wait
WaitAsync
重载之一。为了释放信号量,它调用 Release 重载之一。当计数达到零时,对 Wait 方法之一的后续调用将阻塞,直到其他线程释放信号量。

如果您想创建一个立即允许一个线程等待并“通过”的信号量,您应该使用初始值 1 而不是 0 创建它。


-1
投票

我理解你的观点,但是示例内部文档呢

learn.microsoft.com SemaphoreSlim 类

semaphore = new SemaphoreSlim(0, 3);

并且任务列表执行没有问题

© www.soinside.com 2019 - 2024. All rights reserved.