我知道在同步世界中,第一个代码片段是正确的,但是WaitAsync和async/await魔术又如何呢?请给我一些.net内部。

await _semaphore.WaitAsync();
try
{
    // todo
}
finally
{
    _semaphore.Release();
}

或者
try
{
    await _semaphore.WaitAsync();
    // todo
}
finally
{
    _semaphore.Release();
}

最佳答案

根据MSDN,SemaphoreSlim.WaitAsync可能会抛出:

  • ObjectDisposedException-如果信号量已被处置
  • ArgumentOutOfRangeException-如果您选择接受int的重载并且它是负数(不包括-1)

  • 在这两种情况下,SemaphoreSlim都不会获取该锁,这使得在finally块中释放它变得不必要。

    要注意的一件事是,如果对象在第二个示例中被放置或为null,则将执行finally块,并触发另一个异常或调用Release,而finally可能首先没有获得任何要释放的锁。

    最后,我将使用前者来确保与非异步锁的一致性,并避免ojit_code块中的异常

    关于c# - 尝试块之前/之后的SemaphoreSlim.WaitAsync,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24139084/

    10-11 07:10