在异步方法中使用信号量是否会导致WPF调度程序线程出现死锁?

时间:2016-12-02 11:03:55

标签: c# wpf multithreading httpclient semaphore

我从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);
    }
}

1 个答案:

答案 0 :(得分:0)

  

在等待信号量时可能会阻止调度程序线程

您所显示的代码不会发生这种情况。它使用异步等待(await),因此线程不会被阻止。