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

标签 asp.net multithreading async-await threadpool application-pool

考虑以下在 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() 中运行的代码受 IO 限制。

最佳答案

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

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

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

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

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

关于asp.net - 在 IIS 上运行的 ASP.Net 应用程序中调用 Thread.Run,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35360895/

相关文章:

asp.net - 在 Ajax Control Toolkit 的级联下拉列表更新中

c# - 使用联锁用法

c - 如何查询多个 pthread(子线程)以了解哪一个线程终止

c# - 使用 ManualResetEventSlim 而不是 ManualResetEvent 的最短等待时间是多少?

c# - 在 Select LINQ 方法中使用 Task.Run()

javascript - sails.js http.get 和回调函数?

asp.net - 将 ID 添加到 GridView 行

asp.net - 对资源文件禁用 Visual Studio 的访问修饰符下拉选项

c# - 使用 c# linq 一次填充/加载列表以提高性能

asp.net-mvc - Windows Azure 服务总线通知中心仅接收部分通知