11

我不是高级开发人员。我只是想抓住任务库并进行​​谷歌搜索。我从来没有使用过这个类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();
}));

我期待有一个很好的解释和帮助来理解这两组代码。谢谢

4

1 回答 1

17

为什么 10 传递给 SemaphoreSlim 构造函数。

他们SemaphoreSlim习惯于一次限制为 10 个任务。信号量在每个任务开始之前“获取”,每个任务在完成时“释放”它。有关信号量的更多信息,请参阅MSDN

他们可以简单地使用 Task.Delay(3000) 但为什么他们在这里使用 await。

Task.Delay创建一个在指定时间间隔后完成的任务并返回它。像大多数Task-returning 方法一样,Task.Delay立即返回;Task延迟的是返回的。因此,如果代码没有await它,就不会有延迟。

只是真的不明白添加任务后要如何运行列表?

基于任务的异步模式中,Task对象返回“热”。这意味着它们在返回时已经在运行。最后await Task.WhenAll是等待他们全部完成。

于 2013-11-15T13:40:33.010 回答