我从System.Net.HttpClient
类派生来实现处理令牌检索和重新生成的客户端。使用所有必需的身份验证参数初始化客户端,并且可能同时使用该客户端。在这种情况下,我需要阻止客户端请求多个令牌(针对不同的请求)。
如果用户在调度程序线程上启动多个Web请求,我不确定我的代码是否会导致WPF应用程序死锁(因为信号量是不可重入的,因此调度程序线程可能在等待信号量时被阻塞,如果调度程序线程被阻止,原始任务可能无法完成。
public class ApiClient : HttpClient
{
public override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
if (_token == null)
{
await _semaphore.WaitAsync(cancellationToken);
try
{
if (_token == null)
{
// _token = await _tokenService.AcquireToken(xx,xx,xx);
}
}
finally
{
_semaphore.Release();
}
}
else if (_token.IsExpired)
{
await _semaphore.WaitAsync(cancellationToken);
try
{
if (_token.IsExpired)
{
// _token = await _tokenService.RefreshToken(xx,xx,xx);
}
}
finally
{
_semaphore.Release();
}
}
return await base.SendAsync(request, cancellationToken);
}
}
答案 0 :(得分:0)
在等待信号量时可能会阻止调度程序线程
您所显示的代码不会发生这种情况。它使用异步等待(await
),因此线程不会被阻止。