在 IIS 上的 ASP.Net 应用程序 运行 中调用 Thread.Run

Calling Thread.Run in an ASP.Net application running on IIS

考虑以下 运行 在 IIS 上的 ASP.Net Web 应用程序中的代码...

_thread = new Thread(Method1)
_thread.Start();

由于ASP.Net进程中有一个线程池,这段代码的作用是什么?具体...

  1. 是否会从 ASP.Net 线程池中获取另一个线程?或者来自 不同的 线程池?还是这段代码绕过线程池,直接获取一个新的线程?

  2. 这是用于处理页面请求的同一个线程池吗?因此,这段用于提高性能的代码实际上可以通过采用另一个可用于为另一个用户提供另一个资源的线程来降低性能?

  3. 线程池是否仅用于服务非静态资源? IIS 是否有自己的线程池来为不通过托管管道 运行 的资源提供服务?

  4. 如果应用程序会发生什么。调用 _thread.Start() 后池被回收了? IIS 会允许此线程在关闭应用程序池之前完成吗?

  5. 好像是这段代码强制创建了一个新线程。将此代码交换为使用 Async/Wait 会有好处吗? Method1()中运行s的代码是IO绑定的。

  1. 当您显式调用 new Thread 时,该线程不是线程池的一部分。你完全靠自己了。

  2. 所谓的ASP.NET线程池纯粹用来处理请求消息(寄宿HttpApplication派生对象)。

  3. 静态文件由 IIS 本机提供,因此 ASP.NET 线程池仅用于 ASP.NET 内容。但是在这里你应该注意到所有发生在工作进程内(w3wp.exe)。只有一些由本机组件处理,而其他则由托管组件处理。如果使用集成流水线模式,流水线是统一的。

  4. 应用程序池回收只等待请求被处理。当所有请求完成后,您自己的线程将被杀死。

  5. Async/await 不会自动创建线程。但是通过切换到 async/await,您确实避免了创建线程,这应该有助于提高性能。

ASP.NET 4.5+(可以使用 async-await 的版本)使用相同的线程池来处理请求并通过 Task.Run.

安排任务执行

当您在处理 ASP.NET 请求时使用 Task.Run 时,您会将上下文更改为新的线程池线程并将当前线程池线程返回到线程池。任务完成后,您将切换回另一个线程池线程。

在处理 ASP.NET 请求时使用 Task.Run 至少需要一个线程池线程,并导致至少两次上下文切换。

归根结底,它需要更多资源并花费更多时间来处理请求。