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。它应该允许1个线程通过,对吧?
否 - 当前值为 0,与您所写的完全相同。
信号量值在等待时会向下计数 - 该计数实际上是“可获取的令牌数量”。来自文档:
每次线程进入信号量时计数都会递减,每次线程释放信号量时计数都会递增。要输入信号量,线程调用
或Wait
重载之一。为了释放信号量,它调用 Release 重载之一。当计数达到零时,对 Wait 方法之一的后续调用将阻塞,直到其他线程释放信号量。WaitAsync
如果您想创建一个立即允许一个线程等待并“通过”的信号量,您应该使用初始值 1 而不是 0 创建它。
我理解你的观点,但是示例内部文档呢
learn.microsoft.com SemaphoreSlim 类
semaphore = new SemaphoreSlim(0, 3);
并且任务列表执行没有问题