簡體   English   中英

關於使用Async / Await的SemaphoreSlim的用法

[英]Regarding the usage of SemaphoreSlim with Async/Await

我不是高級開發人員。 我只是試圖抓住任務庫,只是谷歌搜索。 我從未使用過SemaphoreSlim這個類,所以我想知道它是做什么的。 在這里,我提出了SemaphoreSlimasyncawait但我不明白的代碼。 有人可以幫助我理解下面的代碼。

第一組代碼

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM