gpt4 book ai didi

c# - 在 .NET Web 应用程序中填充缓存时的线程管理

转载 作者:太空宇宙 更新时间:2023-11-03 10:21:34 24 4
gpt4 key购买 nike

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

  1. 如果我在缓存代码上使用临界区 (lock),所有请求都将被阻止。这是对资源的巨大浪费,我什至会耗尽我的 IIS 工作线程池。
  2. 如果我使用异步请求,网络请求将在加载缓存之前全部返回。我无法“回调”已经将其内容返回给客户端的 Web 请求!

如何正确管理线程?也许有一种方法可以将所有请求移动到一个异步等待缓存加载的线程,然后在加载缓存后将它们移回单独的线程?

最佳答案

If I use a critical section (lock) on the caching code, all the requests will block.

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

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

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

If I use async requests

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

关于c# - 在 .NET Web 应用程序中填充缓存时的线程管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33283833/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com