关于使用Async / Await的SemaphoreSlim的用法

时间:2013-11-15 10:22:12

标签: c# asynchronous async-await semaphore

我不是高级开发人员。我只是试图抓住任务库,只是谷歌搜索。我从未使用过班级SemaphoreSlim所以我想知道它的作用。在这里,我展示SemaphoreSlimasync& 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;有助于理解这两组代码。感谢

1 个答案:

答案 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正在等待所有人完成。