У меня есть метод инициализации кеша в памяти некоторых объектов, который вызывается перед входом в кеш. Насколько я знаю, я правильно использовал 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 не вызывался?