internal async Task<Something> InitSomethingAsync()
{
return await _some.SetSomethingFlags(SomethingtFlagsAsync(_sportDataDays));
}
public async Task<EventPropertiesFilter> SetSomethingFlags(Task<HashSet<ValueTuple<long, int>>> paramTask)
{
_fieldValue = _fieldValue ?? await paramTask;
return this;
}
public async Task<HashSet<ValueTuple<long, int>>> SomethingtFlagsAsync()
{
return await _cache.GetCacheItemAsync<HashSet<ValueTuple<long, int>>>(async () => await GetSomething());
}
Внутри GetCacheItemAsync используется 'copy-past' реализация SemaphorSlim, _useCount которого будет равен 1 если метод SetSomething вызывать два раза, ибо _fieldValue уже проинициализировано. Т.е занятый семафор будет в таком состоянии до завершения запроса. Не очень понятна причина.
Семафор используется в рамках using блока и если я правильно понимаю реализацию, то по окончанию этого блока, семафор должен быть удален из общего словаря:
private void Release(SemaphoreWrapper wrapper)
{
lock (_lock)
{
var isEmpty = wrapper.Release();
if (!isEmpty)
return;
_wrapperMap.Remove(wrapper.Key);
}
}
UPD. Сомнительное условие и прочий код был переписан, но тем не менее хотелось бы иметь больше понимания о возникшей проблеме.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости