我知道在同步世界中,第一个代码片段是正确的,但是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/