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

时间:2018-03-10 14:14:20

标签: c# .net asynchronous async-await

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个线程通过,对吧?为什么它不在这个例子中?

1 个答案:

答案 0 :(得分:10)

  

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

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

信号量值在等待时计算 down - 计数是有效的"可获得的令牌数量"。来自docs

  

每次线程进入信号量时计数递减,每次线程释放信号量时递增计数。要输入信号量,线程会调用WaitWaitAsync重载之一。要释放信号量,它会调用Release重载之一。当计数达到零时,后续调用其中一个Wait方法会阻塞,直到其他线程释放信号量。

如果你想创建一个信号量,它会立即允许一个线程等待它并且#34;传递",你应该创建一个初始值为1而不是0的信号量。