[英]Regarding the usage of SemaphoreSlim with Async/Await
我不是高級開發人員。 我只是試圖抓住任務庫,只是谷歌搜索。 我從未使用過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
再次出現在while
循環中?
什么是ss.WaitAsync();
做?
DoPollingThenWorkAsync()
函數期待SemaphoreSlim
但在調用時不會傳遞任何內容。 這是錯字嗎?
為什么要await Task.Delay(3000);
用過的?
他們可以簡單地使用Task.Delay(3000)
但他們為什么要await
這里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();
}));
我期待着一個很好的解釋和幫助理解這兩組代碼。 謝謝
為什么10傳遞給SemaphoreSlim構造函數。
他們使用SemaphoreSlim
限制10個任務。 信號量在每個任務啟動之前被“采用”,每個任務在完成時“釋放”它。 有關信號量的更多信息,請參閱MSDN 。
他們可以使用簡單的Task.Delay(3000),但為什么他們在這里使用等待。
Task.Delay
創建一個在指定的時間間隔后完成並返回它的任務。 像大多數Task
-returning方法一樣, Task.Delay
立即返回; 它是具有延遲的返回Task
。 因此,如果代碼沒有await
它,就沒有延遲。
只是真的不明白添加任務后列出它們如何運行?
在基於任務的異步模式中 , Task
對象返回“熱”。 這意味着他們在返回時已經在運行。 await Task.WhenAll
在最后等待他們全部完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.