gpt4 book ai didi

c# - 异步方法中的信号量等待与 WaitAsync

转载 作者:太空狗 更新时间:2023-10-29 19:58:01 25 4
gpt4 key购买 nike

我试图找出在这种上下文中使用的 Wait 和 WaitAsync 的 SemaphoreSlim 使用之间的区别:

private SemaphoreSlim semaphore = new SemaphoreSlim(1);
public async Task<string> Get()
{
// What's the difference between using Wait and WaitAsync here?
this.semaphore.Wait(); // await this.semaphore.WaitAsync()

string result;
try {
result = this.GetStringAsync();
}
finally {
this.semaphore.Release();
}

return result;
}

最佳答案

如果您有异步方法——您希望尽可能避免任何阻塞调用。 SemaphoreSlim.Wait() 是一个阻塞调用。那么,如果您使用 Wait() 并且此时信号量不可用,会发生什么情况?它会阻塞调用者,这对于异步方法来说是非常意想不到的事情:

// this will _block_ despite calling async method and using await
// until semaphore is available
var myTask = Get();
var myString = await Get(); // will block also

如果您使用 WaitAsync - 如果此时信号量不可用,它不会阻止调用者。

var myTask = Get();
// can continue with other things, even if semaphore is not available

此外,您还应该注意将常规锁定机制与 async\await 一起使用。这样做之后:

result = await this.GetStringAsync();

你可能在 await 之后在另一个线程上,这意味着当你试图释放你获得的锁时 - 它可能会失败,因为你试图释放它而不是从你获得它的同一个线程.请注意,信号量不是这种情况,因为它没有线程亲和性(不像其他类似的构造,如 Monitor.EnterReaderWriterLock 等上)。

关于c# - 异步方法中的信号量等待与 WaitAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44305825/

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