【发布时间】:2020-05-07 15:53:35
【问题描述】:
我有一个基于 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,如果此时方法没有运行,我如何从 GetStuff() 获得相同的结果?
【问题讨论】:
-
看看
Lazy<>。它可以是线程安全的,所有调用都会阻塞,直到它第一次返回,然后所有调用都会被释放。
标签: c# multithreading .net-core async-await