将请求任务置于保持状态,直到某个其他请求任务完成,然后恢复它们

时间:2014-09-26 09:44:01

标签: c# httprequest windows-8.1 threadpool windows-phone-8.1

我的情况是:我的应用程序中有一个Http Authentication请求,它返回一个访问令牌,用于后续的Http请求。
我可以同时执行多个请求,但是它们需要一个有效的访问令牌,因此在每次请求之前我都会检查访问令牌是否有效。
如果它不存在或无效,我必须创建另一个身份验证请求以检索新的访问令牌。问题是,每个其他请求必须在执行之前等待此请求的答案。此外,我不能同时运行两个身份验证请求,新的必须等待旧的完成才能执行。

那么,我怎么能收到一些我可以说的请求:“如果访问令牌无效,请等待我在执行请求之前要执行的新身份验证请求”?

1 个答案:

答案 0 :(得分:1)

很容易推出自己的类型,根据您的要求管理访问令牌的生命周期:

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,它会出去为您获取新的有效令牌,或者吐出缓存的令牌。如果您知道在应用程序中只需要一个实例,则可以将管理器实现为单例。