IIS 工作线程与 Web 应用程序线程
IIS worker thread vs web application thread
我正在维护一个 ASP.NET Core
Web 应用程序,它需要重复 运行 一些后台线程。我知道这不是一个好的设计,但目前我必须以最小的努力解决它的主要问题。现在我想知道我是否应该担心通过网络服务器处理用户的 http 请求?
问题很简单,但我找不到明确的答案:
像这样在应用程序中创建的线程有什么区别:
Task.Run(() => { // some parallel job })
和处理 http 请求的 IIS 工作线程?
它们是来自同一个线程池还是驻留在不同的池中?
根据 this 都是一个池:"ASP.NET Core already runs app code on normal Thread Pool threads." 换句话说,服务请求的线程与后台线程没有单独的最大值。
最大的不同是 IIS 知道它自己为传入请求创建的线程。 IIS 不知道您自己创建的任何线程。
当回收应用程序池或关闭 IIS 时,它会等到所有请求都已完成处理 - 它会等到它为每个请求创建的线程已完成处理 - 然后终止进程。如果您创建任何比请求存活更久的线程(例如,如果您创建一个后台线程,然后将响应发送回客户端),IIS 不知道该线程仍然 运行 并可能随时终止整个进程时间.
如果您在所有线程都完成之前没有return响应,那么您就不会有那个特定的问题。
另一个问题是您可能会达到允许的最大线程数。然后会发生各种奇怪的性能问题。但这取决于您创建的线程数以及传入的 HTTP 请求数。
我正在维护一个 ASP.NET Core
Web 应用程序,它需要重复 运行 一些后台线程。我知道这不是一个好的设计,但目前我必须以最小的努力解决它的主要问题。现在我想知道我是否应该担心通过网络服务器处理用户的 http 请求?
问题很简单,但我找不到明确的答案:
像这样在应用程序中创建的线程有什么区别:
Task.Run(() => { // some parallel job })
和处理 http 请求的 IIS 工作线程?
它们是来自同一个线程池还是驻留在不同的池中?
根据 this 都是一个池:"ASP.NET Core already runs app code on normal Thread Pool threads." 换句话说,服务请求的线程与后台线程没有单独的最大值。
最大的不同是 IIS 知道它自己为传入请求创建的线程。 IIS 不知道您自己创建的任何线程。
当回收应用程序池或关闭 IIS 时,它会等到所有请求都已完成处理 - 它会等到它为每个请求创建的线程已完成处理 - 然后终止进程。如果您创建任何比请求存活更久的线程(例如,如果您创建一个后台线程,然后将响应发送回客户端),IIS 不知道该线程仍然 运行 并可能随时终止整个进程时间.
如果您在所有线程都完成之前没有return响应,那么您就不会有那个特定的问题。
另一个问题是您可能会达到允许的最大线程数。然后会发生各种奇怪的性能问题。但这取决于您创建的线程数以及传入的 HTTP 请求数。