锁语句块中的异步方法
我想在缓存中放置一个身份validation令牌,它可以在多个应用程序域中使用。 此令牌将每小时到期。 当客户端无法使用令牌进行授权时,它会要求令牌生成服务生成新令牌。
我只希望第一个不成功进行身份validation的客户端进行此重新生成,因此我使用了这样的锁定对象:
public async Task 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
方法,并且在lock-statement块中不允许async
方法。 我对AuthClient
没有任何控制权,我可以采用其他策略吗?
您可以使用SemaphoreSlim
作为基本的异步就绪lock
替换:
private readonly SemaphoreSlim lockObject = new SemaphoreSlim(1); public async Task 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; }