等待信号量的异步调用会产生死锁

时间:2019-06-18 06:48:31

标签: c# asynchronous parallel-processing async-await

从最近几天开始,我面对下面的代码段的间歇性死锁,仅当我们使用异步调用时发生,我的Api调用挂起了无限的时间,最糟糕的是我无法重现它在我的本地计算机上,它来自UAT和生产环境(在IIS重置后工作正常)。

此外,我们在WebAPI Project中使用此方法,并且该类已注册为WebPerRequest。

static SemaphoreSlim semaphore = new SemaphoreSlim(1, 1);
static ConcurrentDictionary<string, List<Employee>> _data;

/// Intermittent Deadlock after some time
private async Task<ConcurrentDictionary<string, List<Employee>>> GetEmployees()
    {
        await semaphore.WaitAsync();
        try 
        {
          if (_data == null)
            {
                  // async db call  
            }

        }

       finally
        {
            semaphore.Release();
        }
        return _data ;
    } 

// Working Fine
private async Task<ConcurrentDictionary<string, List<Employee>>> GetEmployees()
    {
        await semaphore.WaitAsync();
        try 
        {
          if (_data == null)
            {
                  // sync db call  
            }
        }

       finally
        {
            semaphore.Release();
        }
        return _data ;

    } 

0 个答案:

没有答案