我不是高级开发人员。我只是想抓住任务库并进行谷歌搜索。我从来没有使用过这个类SemaphoreSlim
,所以我想知道它的作用。在这里,我介绍SemaphoreSlim
了与async
&一起使用await
但我不明白的代码。有人可以帮我理解下面的代码。
第一组代码
await WorkerMainAsync();
async Task WorkerMainAsync()
{
SemaphoreSlim ss = new SemaphoreSlim(10);
while (true)
{
await ss.WaitAsync();
// you should probably store this task somewhere and then await it
var task = DoPollingThenWorkAsync();
}
}
async Task DoPollingThenWorkAsync(SemaphoreSlim semaphore)
{
var msg = Poll();
if (msg != null)
{
await Task.Delay(3000); // process the I/O-bound job
}
// this assumes you don't have to worry about exceptions
// otherwise consider try-finally
semaphore.Release();
}
首先,WorkerMainAsync
调用 will 并SemaphoreSlim
使用 a。为什么要10
传递给构造函数SemaphoreSlim
?
控制何时while
再次退出循环?
做什么ss.WaitAsync();
?
该DoPollingThenWorkAsync()
函数期待 aSemaphoreSlim
但在调用时未传递任何内容。这是错字吗?
为什么await Task.Delay(3000);
使用?
他们可以简单地使用Task.Delay(3000)
,但为什么他们await
在这里使用呢?
用于相同目的的第二组代码
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
}
}
这是一项任务并已ss.Release
添加到列表中。我真的不明白添加到列表后如何运行任务?
trackedTasks.Add(Task.Run(async () =>
{
await DoPollingThenWorkAsync();
ss.Release();
}));
我期待有一个很好的解释和帮助来理解这两组代码。谢谢