ASP.NET 处理程序、手动线程和 COM 服务器
ASP.NET Handler, manual threads and COM servers
我正在开发一个遗留应用程序,其中 ASP.NET HttpHandler 运行 拥有自己的线程池,该线程池加载自己的进程外 COM 对象实例。请求进入并将工作负载传递给这些 COM 对象,完成后 return 结果。
处理工作正常,您肯定会看到池正在工作,因为同时传入的请求得到可靠处理...只要池线程数保持在 10 以下并且池不会因繁忙请求而饱和。一旦池既没有使 COM 请求饱和,也没有使普通 ASP.NET 处理程序请求达到 ASP.NET 管道,直到池释放一个实例。
当我 运行 具有 16 个实例的线程池并用需要 5 秒才能完成的长 运行ning(等待)请求访问服务器时,我可以看到恰好有 10 个实例被加载工作。除此之外的任何实例都不会被击中。不仅如此 - 即使是直接的处理程序请求,如果没有到达 COM 池,也会在此时开始排队。
更多信息:
- COM 池是使用 MTA 线程创建的(但 STA 不会更改任何内容)
- COM 对象是 STA 线程化的并且在进程 EXE 之外
- COM 对象在创建时所在的同一个固定线程上执行(即没有 COM 线程编组)
- ASP.NET 线程向池线程发出信号以开始处理
- 当前 ASP.NET 上下文被传递到池线程
- 运行.NET 4.5
- 在 Windows 10 Pro
上测试
我使用自定义线程池的原因是因为 COM 依赖性以及需要确保 COM 对象在没有 COM 编组的情况下保持加载在同一线程上。如前所述,它工作正常,直到所有实例都处于忙碌状态,然后一切才会停止,直到池释放一个新实例。
我可以理解 COM 对象可能被阻塞,但我真的不明白为什么主 ASP.NET 线程甚至无法处理原始处理程序请求(即我有一个标志 ASP.NET =54=]s 是一个普通的 Response.Write() 响应和 returns 并且它像池饱和时的 COM 请求一样坐着等待)
我怀疑它与 COM 对象实例化有关,但我很困惑为什么在非 ASP 托管线程上创建对象时会发生这种情况。
有没有人见过这样的行为,其中 ASP.NET 根本不会创建新的请求线程而只是简单地排队?
客户端 OS 上的 IIS(例如 Windows 7)对并发连接数有限制。例如,参见 http://forums.iis.net/p/1229666/2114928.aspx?Is+there+an+Concurrent+Request+Limit+on+IIS+8+5+。
我正在开发一个遗留应用程序,其中 ASP.NET HttpHandler 运行 拥有自己的线程池,该线程池加载自己的进程外 COM 对象实例。请求进入并将工作负载传递给这些 COM 对象,完成后 return 结果。
处理工作正常,您肯定会看到池正在工作,因为同时传入的请求得到可靠处理...只要池线程数保持在 10 以下并且池不会因繁忙请求而饱和。一旦池既没有使 COM 请求饱和,也没有使普通 ASP.NET 处理程序请求达到 ASP.NET 管道,直到池释放一个实例。
当我 运行 具有 16 个实例的线程池并用需要 5 秒才能完成的长 运行ning(等待)请求访问服务器时,我可以看到恰好有 10 个实例被加载工作。除此之外的任何实例都不会被击中。不仅如此 - 即使是直接的处理程序请求,如果没有到达 COM 池,也会在此时开始排队。
更多信息:
- COM 池是使用 MTA 线程创建的(但 STA 不会更改任何内容)
- COM 对象是 STA 线程化的并且在进程 EXE 之外
- COM 对象在创建时所在的同一个固定线程上执行(即没有 COM 线程编组)
- ASP.NET 线程向池线程发出信号以开始处理
- 当前 ASP.NET 上下文被传递到池线程
- 运行.NET 4.5
- 在 Windows 10 Pro 上测试
我使用自定义线程池的原因是因为 COM 依赖性以及需要确保 COM 对象在没有 COM 编组的情况下保持加载在同一线程上。如前所述,它工作正常,直到所有实例都处于忙碌状态,然后一切才会停止,直到池释放一个新实例。
我可以理解 COM 对象可能被阻塞,但我真的不明白为什么主 ASP.NET 线程甚至无法处理原始处理程序请求(即我有一个标志 ASP.NET =54=]s 是一个普通的 Response.Write() 响应和 returns 并且它像池饱和时的 COM 请求一样坐着等待)
我怀疑它与 COM 对象实例化有关,但我很困惑为什么在非 ASP 托管线程上创建对象时会发生这种情况。
有没有人见过这样的行为,其中 ASP.NET 根本不会创建新的请求线程而只是简单地排队?
客户端 OS 上的 IIS(例如 Windows 7)对并发连接数有限制。例如,参见 http://forums.iis.net/p/1229666/2114928.aspx?Is+there+an+Concurrent+Request+Limit+on+IIS+8+5+。