C# 在.NET web应用中填充缓存时的线程管理

C# 在.NET web应用中填充缓存时的线程管理,c#,asp.net,multithreading,caching,C#,Asp.net,Multithreading,Caching,我有一个用于数据报告的.NET MVC web应用程序。当应用程序首次加载时,它会从远程服务器请求大量数据,然后在web服务器内存中本地缓存这些数据。在缓存加载之前,无法响应传入的请求。加载缓存时传入的每个请求都必须等待线程加载缓存 如果我在缓存代码上使用关键部分(lock),所有请求都将被阻止。这是一个巨大的资源浪费,我甚至可能耗尽我的IIS工作线程池 如果使用异步请求,则在加载缓存之前,web请求将全部返回。我无法“回调”已将其内容返回给客户端的web请求 如何正确管理线程?也许有一种方法可

我有一个用于数据报告的.NET MVC web应用程序。当应用程序首次加载时,它会从远程服务器请求大量数据,然后在web服务器内存中本地缓存这些数据。在缓存加载之前,无法响应传入的请求。加载缓存时传入的每个请求都必须等待线程加载缓存

  • 如果我在缓存代码上使用关键部分(
    lock
    ),所有请求都将被阻止。这是一个巨大的资源浪费,我甚至可能耗尽我的IIS工作线程池
  • 如果使用异步请求,则在加载缓存之前,web请求将全部返回。我无法“回调”已将其内容返回给客户端的web请求
    如何正确管理线程?也许有一种方法可以将所有请求移动到一个线程,该线程异步等待缓存加载,然后在加载缓存后将它们移回各个线程?

    不要将缓存加载到新线程中:如果您希望不提供任何请求,则应在app\u start中加载缓存。如果再次提供应用程序加载的请求。

    应用程序是否需要经常重新启动?如果没有,您可以使用某种类型的获取例程,从远程web服务器请求更新的数据,并在一个关键部分交换所有相关缓存

    本质上,在后台获取数据并一次提交所有数据(您可以在提交期间锁定,以避免对正确值的争用)

    如果我在缓存代码上使用关键部分(锁),所有请求都将被阻止

    这是真的。您可以使用
    SemaphoreSlim.WaitAsync
    异步等待。这就像一个锁。对于许多请求排队(如1000个)的情况,您可能需要一个解决方案。您可以使用第二个信号量,最大计数为1000,等待超时为零。如果等待失败,您知道>=1000个请求正在运行,您可以使请求失败

    最大的缺点是,现在所有的请求都有一些异步组件。也许您可以在一些中心位置执行此操作,例如异步MVC操作过滤器。否则,您将被迫使所有MVC操作异步,这是一个令人头痛的问题

    请确保正确配置所有ASP.NET和IIS队列

    如果我使用异步请求


    不确定您是否理解async在ASP.NET上下文中的含义。异步请求处理是服务器的一个实现细节。客户端无法检测到它。请求未提前完成。异步IO(以及任何其他形式的异步阻塞)不会导致请求提前结束。

    如果在应用程序启动代码仍在运行时收到请求,会发生什么情况?我想您可能会遇到超时问题。我想在缓存加载后响应所有请求,而不是超时。加载缓存需要多长时间?10-30秒,具体取决于远程服务器响应。在我的应用程序中,在正常使用条件下,这足够让大约100个请求进入。如果我在一个关键部分交换所有内容,线程都会在这两个部分之间阻塞。这对IIS工作线程不好。所谓异步请求,我的意思是,如果在缓存代码中,我异步向远程服务器发出请求。@just.other.programmer,是这样吗?我理解你的意思,但我不知道你想用那句话告诉我什么。这回答了问题吗?我想这回答了问题,我正在研究如何在我的代码中使用
    semaphorsim