gpt4 book ai didi

.net - SempahoreSlim 作为异步代码中的锁的正确用法是什么?

转载 作者:行者123 更新时间:2023-12-03 13:23:27 25 4
gpt4 key购买 nike

如今,在异步代码中,SemaphoreSlim 似乎是 lock(obj) {} 的推荐替代品。 .我找到了有关如何使用它的建议:
https://blog.cdemi.io/async-waiting-inside-c-sharp-locks/
特别是,此人建议此代码:

//Instantiate a Singleton of the Semaphore with a value of 1. This means that only 1 thread can be granted access at a time.
static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1,1);
//Asynchronously wait to enter the Semaphore. If no-one has been granted access to the Semaphore, code execution will proceed, otherwise this thread waits here until the semaphore is released 
await semaphoreSlim.WaitAsync();
try
{
await Task.Delay(1000);
}
finally
{
//When the task is ready, release the semaphore. It is vital to ALWAYS release the semaphore when we are ready, or else we will end up with a Semaphore that is forever locked.
//This is why it is important to do the Release within a try...finally clause; program execution may crash or take a different path, this way you are guaranteed execution
semaphoreSlim.Release();
}
在我看来,这段代码似乎违反了我以前看到的关于如何锁定的建议,即要记住,您的代码可能随时被中断,并且为此编写代码。如果在 await sempahoreSlim.WaitAsync() 之后抛出任何异常并且在输入 try 语句之前,信号量永远不会被释放。这种问题正是我认为lock语句和using语句引入效果如此好的原因。
某处是否有明确说明此代码有效的引用资料?也许在代码被中断之前实际上输入了 try/finally 语句,这是我以前从未知道的?或者,是否存在一种不同的模式,它实际上是正确使用信号量作为锁,或其他异步 .NET 代码的锁定机制?

最佳答案

是的,从理论上讲,await semaphoreSlim.WaitAsync(); 之间确实可能发生某些事情。和 try ,但实际上:在这种情况下,您的应用程序已经 toast 了,因为它正处于内爆调用堆栈的过程中。实际上,虽然这是一个理论上的问题,但无论如何您也没有太多有用的事情可以做,而且您的过程将像病态的东西一样被不雅地放下。
所以我的建议:不要太担心:)
(实际上,更大的风险是线程池死亡螺旋,通常是由线程池线程上的同步异步引起的,这意味着即使您从语义上获取了信号量,也没有池线程可以提供给你去实际做这件事,让你重新释放它)

关于.net - SempahoreSlim 作为异步代码中的锁的正确用法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62577492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com