Можно ли игнорировать выпуск семафора в блоке finally? - PullRequest
1 голос
/ 27 марта 2019

У меня есть метод инициализации кеша в памяти некоторых объектов, который вызывается перед входом в кеш. Насколько я знаю, я правильно использовал SemaphoreSlim, но все же несколько раз семафор блокировался, и никакие потоки не смогли получить доступ к блоку. Есть ли способ, которым снятие блокировки в блоке finally можно игнорировать? Мы используем .NET 4.6.2, ASP.NET MVC и хостинг в качестве приложения Azure.

private static readonly SemaphoreSlim _lock = new SemaphoreSlim(1);

private static async Task<bool> InitializeCache()
{
    if (Cache != null) return true;

    if (await _lock.WaitAsync(30000))
    {
        try
        {
            if (Cache != null) return true;

            var items = await API.GetKeysFromAPI();
            Cache = new ConcurrentDictionary<string, SamlSessionState>(items);

            return true;
        }
        catch (Exception e)
        {
            throw new Exception("Error initializing the cache", e);
        }
        finally
        {
            _lock.Release();
        }
    }
    else
    {
        // This keeps getting called after the semaphore locks up.
        throw new Exception("Error initializing the cache, the semaphore timed out."); 
    }
}

Я ожидаю, что блок finally будет вызываться каждый раз. Может ли прерванный запрос остановить выполнение, чтобы блок finally не вызывался?

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Как указано в ответах выше, а также в документации Microsoft , в некоторых крайних случаях можно пропустить блок finally. Однако я действительно сомневаюсь, что это проблема в вашем случае. Кажется, это просто тупик, вызванный где-то в вашем коде. Используйте дамп своего приложения для дальнейшего анализа или попытайтесь найти тупик с помощью некоторых операторов логирования!

0 голосов
/ 27 марта 2019

Как указано в комментарии "длинный ответ" на этот вопрос , да, в некоторых крайних случаях возможно, что ваш блок finally не будет выполнен. На этот же вопрос есть еще несколько ответов, которые стоит проверить.

...