我的问题是: 我正在从别人的API接收过期令牌.我的任务是仅在我设置的时间请求新令牌(例如,每1分钟一次).我的服务同时收到数百个请求.到了刷新令牌的时候,我的代码请求100个新令牌. 当我做一个测试时,首先请求一个令牌,然后并行请求多个令牌时,返回的是已经创建的令牌.但如果我立刻try 同时发出一百个请求,那么每个人都会收到一个新的令牌. 如何最好地处理这项任务?现在是这样的.
_timeGetToken
次接收令牌
tokenUpdateTime
—需要更新令牌的时间(双倍,分钟(1))
public async Task<string> GetToken()
{
if(DateTime.Now.Subtract(_timeGetToken) > TimeSpan.FromMinutes(tokenUpdateTime))
{
try
{
token = await _api.GetToken(new TokenUser());
_timeGetToken = DateTime.Now;
}
catch (Exception ex)
{
_logger.LogWarning(ex.Message);
}
}
if(token != null)
return token.Token;
return string.Empty;
}
我的测试:
var t1 = await tokenHandler.GetToken();
List<Task<string>> tokensTasks = new();
for (int i = 0; i < 100; i++)
tokensTasks.Add(tokenHandler.GetToken());
var tokens = await Task.WhenAll(tokensTasks);
如果我这样做,我会得到同样的 token , 但如果我删除第一个令牌请求,我将得到一百个不同的令牌
//var t1 = await tokenHandler.GetToken();
List<Task<string>> tokensTasks = new();
for (int i = 0; i < 100; i++)
tokensTasks.Add(tokenHandler.GetToken());
var tokens = await Task.WhenAll(tokensTasks);
一开始我决定使用信号量是值得的,但很明显,在这段代码中,它们不会以任何方式帮助我,我的意思是我需要以不同的方式计算令牌的生命周期或以不同的方式存储它. 提前感谢任何建议