我正在学习异步/等待操作符。我试图弄清楚如何解决以下问题:
我有一个方法Foo()
用来设置属性。它使用来自网络呼叫的数据来执行此操作。 Foo()
方法可以被多个调用者同时调用。网络调用速度很慢,因此我正在缓存结果,以便多个调用将只获取缓存的数据。
public async Task Foo()
{
string key = "some unique cache key";
if (_cacheService.Get(cacheKey, out int someNumber))
{
MyProperty = someNumber;
}
else
{
number = await _externalCallService.GetACoolNumber();
_cacheService.Set(amount, cacheKey, DateTime.UtcNow.AddMinutes(1));
MyProperty = number;
}
}
但是,我遇到了多个调用可能会调用该服务并同时缓存结果的问题。我尝试将对外部服务器的调用放在锁定代码块中,但这会导致错误,因为现在允许在锁定中使用await关键字。我曾尝试使用谷歌搜索,但不确定该问题的正确用语是什么。
如何确保只有1个正在运行的任务调用_externalCallService.GetACoolNumber()
,而其他任务得到的是缓存的结果?
答案 0 :(得分:1)
您可以使用SemaphoreSlim
Class Test
{
private readonly IMyService _myService;
private static readonly SemaphoreSlim _defaultsMutex = new SemaphoreSlim(1, 1);
public Test(IMyService myService)
{
_myService = myService;
}
public async Task FireMutexMethod()
{
await _defaultsMutex.WaitAsync();
try
{
//do some work
}
finally
{
_defaultsMutex.Release();
}
}
}
如果您处于缓存阶段。您需要使用SemaphoreSlim等待您的方法,以便其他线程无法进入