这是我的代码,但我不明白是什么SemaphoreSlim
是在做。
async Task WorkerMainAsync()
{
SemaphoreSlim ss = new SemaphoreSlim(10);
List<Task> trackedTasks = new List<Task>();
while (DoMore())
{
await ss.WaitAsync();
trackedTasks.Add(Task.Run(() =>
{
DoPollingThenWorkAsync();
ss.Release();
}));
}
await Task.WhenAll(trackedTasks);
}
void DoPollingThenWorkAsync()
{
var msg = Poll();
if (msg != null)
{
Thread.Sleep(2000); // process the long running CPU-bound job
}
}
What do await ss.WaitAsync();
and ss.Release();
do?
我想如果我一次运行 50 个线程然后编写如下代码SemaphoreSlim ss = new SemaphoreSlim(10);
那么它将被迫一次运行 10 个活动线程。
当 10 个线程之一完成时,另一个线程将启动。如果我不正确,请帮助我理解示例情况。
Why is await
需要连同ss.WaitAsync();
?什么是ss.WaitAsync();
do?
在拐角处的幼儿园,他们使用 SemaphoreSlim 来控制可以在体育室玩耍的孩子数量。
他们在房间外面的地板上画了5对脚印。
当孩子们到达时,他们将鞋子留在一双免费的脚印上,然后进入房间。
一旦他们玩完,他们就会出来,收集鞋子并为另一个孩子“释放”一个位置。
如果孩子到达后没有留下脚印,他们就会去别处玩耍,或者只是停留一段时间并时不时地检查一下(即没有 FIFO 优先级)。
当老师在附近时,她会在走廊的另一边“释放”额外的一排 5 个脚印,以便另外 5 个孩子可以同时在房间里玩耍。
它也有与 SemaphoreSlim 相同的“陷阱”......
如果孩子玩完并离开房间而没有收集鞋子(不触发“释放”),那么即使理论上有一个空槽位,该槽位仍会被阻塞。不过,孩子通常会被训斥。
有时,一两个偷偷摸摸的孩子会把鞋子藏在别处并进入房间,即使所有脚印都已被记录下来(即,SemaphoreSlim 并不能“真正”控制房间里有多少孩子)。
这通常不会有好结果,因为房间过度拥挤往往会导致孩子们哭泣,老师完全关闭房间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)