gpt4 book ai didi

c# - 锁定语句 block 中的异步方法

转载 作者:行者123 更新时间:2023-11-30 13:56:32 26 4
gpt4 key购买 nike

我想将身份验证 token 放入缓存中,以便在多个应用程序域中使用。此 token 将每小时过期一次。当客户端无法使用 token 进行授权时,它会要求 token 生成服务生成一个新 token 。

我只希望第一个未成功通过身份验证的客户端发生这种重新生成,因此我采用了这样的锁定对象:

public async Task<Token> GenerateToken(Token oldToken)
{
Token token;
lock (lockObject)
{
var cachedToken = GetTokenFromCache();
if (cachedToken == oldToken)
{
var authClient = new AuthClient(id, key);
token = await authClient.AuthenticateClientAsync(); //KABOOM
PutTokenInCache(token);
}
else
{
token = cachedToken;
}
}
return token;
}

我的问题是 AuthClient 只有 async 方法,并且 async 方法在锁定语句 block 中是不允许的。我对 AuthClient 没有任何控制权,我可以在这里采用其他策略吗?

最佳答案

您可以使用 SemaphoreSlim 作为基本的异步就绪 lock 替换:

private readonly SemaphoreSlim lockObject = new SemaphoreSlim(1);
public async Task<Token> GenerateToken(Token oldToken)
{
Token token;
await lockObject.WaitAsync();
try
{
var cachedToken = GetTokenFromCache();
if (cachedToken == oldToken)
{
var authClient = new AuthClient(id, key);
token = await authClient.AuthenticateClientAsync();
PutTokenInCache(token);
}
else
{
token = cachedToken;
}
}
finally
{
lockObject.Release();
}
return token;
}

关于c# - 锁定语句 block 中的异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27231386/

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