- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我知道在同步世界中第一个片段是正确的,但是 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
block 中释放它变得不必要。
需要注意的一件事是,如果在第二个示例中对象被释放或为 null,则 finally block 将执行并触发另一个异常或调用 Release
,这可能尚未获得任何要释放的锁第一名。
总而言之,为了与非异步锁保持一致并避免 finally
block 中的异常
关于c# - SemaphoreSlim.WaitAsync 在 try block 之前/之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24139084/
我试图找出在这种上下文中使用的 Wait 和 WaitAsync 的 SemaphoreSlim 使用之间的区别: private SemaphoreSlim semaphore = new Sema
我对 await 关键字的理解是,await 限定语句之后的代码在完成后作为该语句的延续运行。 因此以下两个版本应该产生相同的输出: public static Task Run(Semaph
SemaphoreSlim 的文档说“只有在所有其他操作都已完成时才应使用 Dispose”。 应该如何调整以下类,以便线程 B 可以在线程 A 等待 Async() 时调用 Dispose()。调用
首先,请原谅我的英语。我将在 Task.WhenAny 之后的附加代码中进行简要说明,我期望的是五个任务中至少有三个将被取消,但都圆满结束。当任务被取消时,SemaphoreSlim.WaitAsyn
我的应用程序正在使用 .NET 4。我正在使用 nuget package 来等待异步 在我的应用程序中,我想按如下方式在 sempahore WaitAsync 调用上进行等待。 Semaphore
我知道在同步世界中第一个片段是正确的,但是 WaitAsync 和 async/await 魔法又是什么呢?请给我一些 .net 内部信息。 await _semaphore.WaitAsync();
SemaphoreSlim.WaitAsync不管用。它跳转到 return currentToken.AccessToken之前GetAccesTokenAsync调用它已完成并抛出 NullExc
我是一名优秀的程序员,十分优秀!