У меня есть метод, который возвращает некоторое значение на основе вызова API, этот API ограничивает количество вызовов, которые вы можете сделать за период времени. Мне нужно получить доступ к результатам этого вызова из нескольких потоков. Прямо сейчас у меня есть следующий код:
class ReturningSemaphoreLocker<TOutput>
{
private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
public async Task<T> LockAsync<T>(Func<Task<T>> worker)
{
await _semaphore.WaitAsync();
try
{
return await worker();
}
finally
{
_semaphore.Release();
}
}
}
Пример использования:
...
private static readonly ReturningSemaphoreLocker<List<int>> LockingSemaphore = new ReturningSemaphoreLocker<List<int>>();
...
public async Task<List<int>> GetStuff()
{
return await LockingSemaphore.LockAsync(async () =>
{
var client = _clientFactory.CreateClient("SomeName");
using (var cts = GetDefaultRequestCts())
{
var resp = await client.GetAsync("API TO QUERY URL", cts.Token);
var jsonString = await resp.Content.ReadAsStringAsync();
var items = JsonConvert.DeserializeObject<List<int>>(jsonString);
return items;
}
});
}
Итак, вопрос: как получить тот же результат от GetStuff()
, если он уже запущен БЕЗ повторного запроса API и повторного запроса API, если метод не запущен в данный момент?