将请求任务挂起,直到其他一些请求任务完成,然后继续它们

本文关键字:任务 请求 然后 继续 其他 挂起 | 更新日期: 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,它将为您获取新的有效令牌,或者吐出缓存的令牌。如果您知道应用程序中只需要一个实例,那么您可以将管理器实现为一个单例。