Асинхронный вызов с ожидаемым семафором создания тупика - PullRequest
0 голосов
/ 18 июня 2019

В последние несколько дней я сталкиваюсь с периодической тупиковой ситуацией из приведенного ниже фрагмента кода. Это происходит только тогда, когда мы используем асинхронный вызов, мой вызов API зависает на бесконечный период времени, самое худшее, что я не могу его воспроизвести на моей локальной машине, он поставляется в UAT и производственной среде (работает нормально после сброса IIS).

Кроме того, мы используем этот метод в проекте WebAPI, и класс зарегистрирован как 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 ;

    } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...