我不是高级开发人员。我只是试图抓住任务库,只是谷歌搜索。我从未使用过班级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
并使用SemaphoreSlim
。为什么10
传递给SemaphoreSlim
的构造函数?
控件什么时候再次出现while
循环?
ss.WaitAsync();
做了什么?
DoPollingThenWorkAsync()
函数期待SemaphoreSlim
但在调用时不会传递任何内容。这是错字吗?
为什么使用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
}
}
这是一项任务&amp; ss.Release
已添加到列表中。我真的不明白添加到列表后如何运行任务?
trackedTasks.Add(Task.Run(async () =>
{
await DoPollingThenWorkAsync();
ss.Release();
}));
我期待着一个很好的解释&amp;有助于理解这两组代码。感谢
答案 0 :(得分:13)
为什么10传递给SemaphoreSlim构造函数。
他们使用SemaphoreSlim
一次限制10个任务。信号量在每个任务启动之前被“采用”,每个任务在完成时“释放”它。有关信号量的更多信息,请参阅MSDN。
他们可以简单地使用Task.Delay(3000),但为什么他们在这里使用等待。
Task.Delay
创建一个在指定的时间间隔后完成并返回的任务。与大多数Task
- 返回方法一样,Task.Delay
会立即返回;返回的Task
是延迟的。因此,如果代码没有await
,那么就没有延迟。
添加任务后列出如何运行,真的不明白?
在Task-based Asynchronous Pattern中,Task
个对象返回“热门”。这意味着他们在返回时已经在运行。最后的await Task.WhenAll
正在等待所有人完成。