我刚刚开始学习SemaphoreSlim
但是semaphore.CurrentCount在这个程序中如何递增和递减?根据我的理解,当调用semaphore.Wait()
时,释放计数器减1,当semaphore.Release()
时,允许两个线程执行,但semaphore.CurrentCount
如何增加?它是从0还是1开始?
var semaphore = new SemaphoreSlim(2, 10);
for (int i = 0; i < 20; i++)
{
Task.Factory.StartNew(() =>
{
Console.WriteLine("Entering task " + Task.CurrentId);
semaphore.Wait(); //releasecount--
Console.WriteLine("Processing task " + Task.CurrentId);
});
}
while (semaphore.CurrentCount <= 2)
{
Console.WriteLine("Semaphore count: " + semaphore.CurrentCount);
Console.ReadKey();
semaphore.Release(2);
}
Console.ReadKey();
答案 0 :(得分:1)
信号量就像一个具有一定容量的房间。使用SemaphoreSlim,您可以指定初始容量和最大容量。达到最大值后,没有人可以进入房间。每离开房间的物品,只允许一个人进入。
CurrentCount获取可以进入房间的剩余线程数。
for (int i = 0; i < 20; i++)
{
Task.Factory.StartNew(() =>
{
Console.WriteLine("Entering task " + Task.CurrentId);
semaphore.Wait(); //only from 2 - 10 threads can be at the time
Console.WriteLine("Processing task " + Task.CurrentId);
});
}
在这里
while (semaphore.CurrentCount <= 2)
如果在那一刻剩余线程的数量小于2,那么你在房间里释放两个空格
答案 1 :(得分:0)
Wait
递减它,Release
递增它。