使用任务仅调用一次Web服务

时间:2018-12-28 11:39:54

标签: c#

我正在学习异步/等待操作符。我试图弄清楚如何解决以下问题:

我有一个方法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(),而其他任务得到的是缓存的结果?

1 个答案:

答案 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等待您的方法,以便其他线程无法进入