我想将身份验证 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/