【发布时间】:2020-08-28 13:59:15
【问题描述】:
我正在维护一个需要重复运行一些后台线程的ASP.NET Core Web 应用程序。我知道这不是一个好的设计,但目前我必须以最小的努力解决它的主要问题。现在我想知道我是否应该担心Web服务器处理用户的http请求?
问题很简单,但我找不到任何明确的答案:
这样在应用程序中创建的线程有什么区别:
Task.Run(() => { // some parallel job })
以及处理 http 请求的 IIS 工作线程?
它们是来自同一个线程池还是位于不同的池中?
【问题讨论】:
-
Web 服务器旨在接受请求、处理并快速返回,不应用于“密集型”代码。 IMO 这些工作任务应该在不同的(非网络)服务器上运行,这样它们就不会干扰提供网页的工作。
-
@Neil 你完全正确,但问题的焦点更多地在于两种线程之间的差异以及它们之间的关系和相互影响
-
它们基本相同。但是您不应该在 Web 服务器应用程序上执行此操作。每次这样做都会影响性能和可用性。
-
@PauloMorgado 我同意这不是一个好的设计,这个系统是几年前设计的,目前我必须以最小的努力解决它的问题。您能否更详细地解释 iis 线程和应用程序线程的关系?如果它们相同,我会感到困惑的是,它们如何与托管应用程序域和非托管 http 请求上下文进行交互!
-
一般来说,如果你在网络服务器上使用
Task.Run,那是因为你正在做一些不应该做的事情来处理网络请求。如果您在此之上阻止当前线程,那么您将无法获得双倍成本。处理请求的线程、处理 I/O 回调的线程、运行异步延续的线程和Task.Run都使用来自同一个线程池的线程。如果浪费它们,会使整个应用程序变慢,甚至可能导致死锁。
标签: c# asp.net-core iis async-await threadpool