考虑以下在 IIS 上的 ASP.Net Web 应用程序中运行的代码...
_thread = new Thread(Method1)
_thread.Start();
由于 ASP.Net 进程中有一个线程池,这段代码的作用是什么?具体...
它会从 ASP.Net 线程池中获取另一个线程吗?或者来自不同的线程池?还是这段代码绕过线程池,直接获取一个新线程?
这是否与用于处理页面请求的线程池相同?因此,这段用于提高性能的代码实际上可以通过采用另一个线程来降低它,该线程可用于为另一个用户提供另一个资源?
线程池是否仅用于服务非静态资源? IIS 是否有自己的线程池来为不通过托管管道运行的资源提供服务?
如果应用程序会发生什么。调用
_thread.Start()
后池被回收了? IIS 会允许此线程在关闭应用程序池之前完成吗?似乎是这段代码强制创建了一个新线程。将此代码交换为使用 Async/Wait 会有好处吗?
Method1()
中运行的代码受 IO 限制。
最佳答案
当您显式调用
new Thread
时,该线程不是线程池的一部分。你完全靠自己。所谓的 ASP.NET 线程池纯粹用于处理请求消息(托管
HttpApplication
派生对象)。静态文件由 IIS native 提供,因此 ASP.NET 线程池仅用于 ASP.NET 内容。但是在这里您应该注意到所有发生在工作进程 (w3wp.exe) 内的事情。只有一些由 native 组件处理,而其他则由托管组件处理。如果使用集成流水线模式,流水线是统一的。
应用程序池回收仅等待请求被处理。当所有请求完成后,您自己的线程将被终止。
Async/await 不会自动创建线程。但是通过切换到 async/await,您确实避免了创建线程,这应该有助于提高性能。
关于asp.net - 在 IIS 上运行的 ASP.Net 应用程序中调用 Thread.Run,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35360895/