C# ASP.NET内核中的线程问题

C# ASP.NET内核中的线程问题,c#,async-await,C#,Async Await,我有一个ASP.NET核心Web API项目。它有一个控制器和一个名为GetLocations的方法 GetLocations连接到internet上的其他5个web服务。收集一些信息并通过json返回集合。在这种方法中,我使用内存缓存每5分钟缓存一次数据 如果缓存过期,它将尝试连接到所有5个服务并获取信息,以此类推 我的问题是: 我有很多用户不断地请求这些数据,每秒有50个请求访问这个API 当缓存过期时,我相信存在某种线程锁定。目前我对该项目的了解有限,但我怀疑所有这些请求都在调用该方法并联

我有一个ASP.NET核心Web API项目。它有一个控制器和一个名为GetLocations的方法

GetLocations连接到internet上的其他5个web服务。收集一些信息并通过json返回集合。在这种方法中,我使用内存缓存每5分钟缓存一次数据

如果缓存过期,它将尝试连接到所有5个服务并获取信息,以此类推

我的问题是:

我有很多用户不断地请求这些数据,每秒有50个请求访问这个API

当缓存过期时,我相信存在某种线程锁定。目前我对该项目的了解有限,但我怀疑所有这些请求都在调用该方法并联系5个相关服务,直到其中一个获得所有5个服务的完整响应


我的假设正确吗?如果是这样,我该如何着手解决这个问题?我是否需要对web服务进行每次异步调用?这有助于这种情况吗?我不是100%确定,因为请求触发了方法调用

您肯定应该使用Async/Await调用外部服务


这只是一个已知的问题,因为最好的做法是在I/O操作(如调用第三方服务)中始终使用async

现在,您还应该创建一个类来管理这些调用。您可以在IoCConfig中将其作为单个项添加。在该类中,确保锁定以避免刚才描述的问题,并且在构建缓存时不要多次调用底层服务

请点击此处:
您面临此问题的原因如下

您正在使用缓存,它将在某个特定时间过期。 缓存过期后,调用外部web服务方法来收集数据。此时,队列中的其他请求可能会选择执行。 一旦选择执行另一个请求,它也会检查缓存,现在它会检查缓存中的数据,然后为其他请求执行外部服务,依此类推。 这个问题的解决办法

首先检查缓存是否包含数据。 如果不创建锁,则以下部分只能由单个线程执行。 现在在锁部分再次检查缓存,若缓存包含数据,那个么只需返回,但它不包含数据,然后调用外部服务。 此时,如果选择另一个线程执行,则它必须等待ExecLive节完成其工作。 一旦该部分完成,它会将数据存储在缓存中,所以如果有任何排队或新请求,它会从缓存中选择数据。 注意:应该是这样的

    public List<string> GetData()
    {
     if(Cache[key] == null)
    {
       lock(obj) // obj should be static
       {
            if(Cache[key] == null)
            {
                // Load data from service
                Cache[key] == data;
            }
        }
     }
     return (List<string>)Cache[Key]; 
     }

我的假设正确吗?-假设你没有提供任何东西,那么它可能是以同样的概率出现的:是/否/可能是。如果你能提供一个。更新时,我会创建一个临时缓存,完成后会复制到实时系统,然后系统将在很短的时间内运行缓慢。要始终在I/O繁重的操作中使用异步,异步不是免费的,您可能会遇到由于性能要求而首选阻塞IO的情况。我同意,一般来说,异步可能是一个默认选择,我的观点是,在这里,始终是一个强有力的词。