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个线程通过,对吧?为什么它不在这个例子中?
答案 0 :(得分:10)
我创建了一个限制为1且当前值为0的信号量。它应该允许1个线程通过,对吧?
否 - 当前值为0,与您所写的完全一样。
信号量值在等待时计算 down - 计数是有效的"可获得的令牌数量"。来自docs:
每次线程进入信号量时计数递减,每次线程释放信号量时递增计数。要输入信号量,线程会调用
Wait
或WaitAsync
重载之一。要释放信号量,它会调用Release重载之一。当计数达到零时,后续调用其中一个Wait方法会阻塞,直到其他线程释放信号量。
如果你想创建一个信号量,它会立即允许一个线程等待它并且#34;传递",你应该创建一个初始值为1而不是0的信号量。