将请求任务挂起,直到其他一些请求任务完成,然后继续它们
本文关键字:任务 请求 然后 继续 其他 挂起 | 更新日期: 2023-09-27 18:24:31
我的场景是:我的应用程序中有一个Http身份验证请求,该请求返回一个访问令牌,该令牌将用于后续的Http请求
我可以同时执行多个请求,但它们需要一个有效的访问令牌,因此在每次请求之前,我都会检查访问令牌是否有效
如果它不存在或无效,我必须创建另一个身份验证请求来检索新的访问令牌。问题是,每个其他请求在执行之前都必须等待该请求的答复。此外,我不能同时运行两个身份验证请求,新的必须等待旧的完成后才能执行
那么,我怎么能有一个请求集合,我可以说:"如果访问令牌无效,请等待我要执行的新身份验证请求,然后再执行您的请求"?
滚动您自己的类型很容易,它将根据您的需求管理访问令牌的生命周期:
class AccessTokenManager
{
private readonly SemaphoreSlim Mutex = new SemaphoreSlim(1, 1);
private AccessToken LastSeenToken;
public async Task<AccessToken> ResolveToken(CancellationToken ct)
{
await this.Mutex.WaitAsync(ct);
try
{
if (this.LastSeenToken == null || !this.LastSeenToken.IsValid)
{
this.LastSeenToken = await this.GetNewAuthTokenAsync(ct);
}
return this.LastSeenToken;
}
finally
{
this.Mutex.Release();
}
}
private async Task<AccessToken> GetNewAuthTokenAsync(CancellationToken ct)
{
// Pure retrieve new token implementation.
}
}
注意:为简洁起见,省略了ConfigureAwait(false)
然后,每当您需要有效的令牌时(大概在每个请求的开头),您只需使用await AccessTokenManagerInstance.ResolveToken
,它将为您获取新的有效令牌,或者吐出缓存的令牌。如果您知道应用程序中只需要一个实例,那么您可以将管理器实现为一个单例。