C# 如何分配IIS7线程?

C# 如何分配IIS7线程?,c#,asp.net,iis-7,C#,Asp.net,Iis 7,我将log4net添加到我的应用程序中,现在可以看到用户活动在我的网站中导航时的线程ID。对于IIS7中的线程分配,是否有任何特定的算法,或者只是一个随机数分配(我怀疑它不是完全随机的,因为我的低流量站点显示的线程大多在10-30之间)?可用线程数的最大值是多少?我注意到我的调度程序显示了一个奇怪的线程id——有什么原因吗?调度程序是Quartz.net,id显示为“scheduler\u Worker-10”,而不仅仅是一个数字。解释了您需要知道的所有内容 摘录: 当ASP.NET托管在中的I

我将log4net添加到我的应用程序中,现在可以看到用户活动在我的网站中导航时的线程ID。对于IIS7中的线程分配,是否有任何特定的算法,或者只是一个随机数分配(我怀疑它不是完全随机的,因为我的低流量站点显示的线程大多在10-30之间)?可用线程数的最大值是多少?我注意到我的调度程序显示了一个奇怪的线程id——有什么原因吗?调度程序是Quartz.net,id显示为“scheduler\u Worker-10”,而不仅仅是一个数字。

解释了您需要知道的所有内容

摘录:

当ASP.NET托管在中的IIS 7.0上时 集成模式下,线程的使用是 有点不同。首先是 应用程序级队列不再存在。 他们的表演总是非常精彩 很糟糕,解决这个问题没有希望, 所以我们把他们赶走了。但也许 最大的区别是在IIS中 6.0或ISAPI模式,ASP.NET同时限制线程数 正在执行请求,但在IIS 7.0中 在集成模式下,ASP.NET限制了 同时执行的任务数 请求。区别只起作用 当请求是异步的时 (该请求具有 中的异步处理程序或模块 管道完工了 异步地)。显然,如果 请求是同步的,那么 同时执行的任务数 请求数与请求数相同 并发执行的线程 请求,但如果请求是 那么这两个数字呢 可能会和你完全不同 有比线程多得多的需求


因此,基本上,如果请求是同步的,则每个请求的线程数相同。参见此处了解各种信息。

我已经解释过这是我博客上的一篇博文

标题与您的问题不一致,但我解释了IIS处理请求的方式,我相信您会得到答案

这篇文章的引文

当IIS字段请求您的 应用程序将其交给 工作进程。工作进程 turn创建您的 全局类(类型为 HttpApplication)。从那时起 ASP.NET的典型流程 应用程序发生(ASP.NET) 管道)。然而,你需要做什么 了解和理解的是工人 进程(将其视为IIS) 保留您的实例 HttpApplication(您的 全局类)处于活动状态,以便 其他要求。事实上,它是默认的 它将创建并缓存多达10个 全局类的实例,如果 必需(延迟实例化) 根据负载的数量 请求您的网站收到其他 因素。在上面的图1中 ASP.NET应用程序的实例 显示为红色框。那里 最多可以缓存其中的10个 工人进程。这些真是 工作进程拥有的线程 创建并缓存,每个线程都有 它自己的全局类实例。 请注意,这些线程中的每一个都处于 相同的应用程序域。有静电吗 你在学校里可能上的课 应用程序在每个应用程序之间共享 这些线程或应用程序 实例

我建议你读一下那篇文章,我很乐意回答你的任何问题。请注意,我有意使本文保持简单,因为我不谈论内核中发生了什么,也不深入讨论参与其中的各种组件的细节。保持简单有助于人们更好地理解概念(我觉得)

我将在这里回答您的其他一些问题:

  • 对于IIS7如何进行线程分配,是否有任何特定的算法
  • 不,不管怎么说,这都是随机的。这是在我所指的那篇文章中解释的。简单的回答是,如果缓存线程可用,那么IIs将使用它。如果没有,它将创建一个新线程,创建HttpApplication的实例(全局),并将所有上下文分配给它。因此,在一个不忙的站点中,您可能会看到相同的线程处理请求。但没有任何保证。如果有多个空闲线程,IIS将随机选择一个线程为该请求提供服务。您应该注意,即使在一个不太繁忙的站点中,如果您的请求需要很长时间,IIS也将被迫创建新线程来服务其他传入的请求

  • 可用线程数的最大值是多少
  • 是的(如文章中所解释的),通常每个辅助进程有10个线程。这是可以调整的,但我在很多非常繁忙的网站上工作过,我从来没有这样做过。关键是让您的应用程序尽可能快地响应。请注意,应用程序可以分配多个工作进程(在应用程序池中配置),因此在繁忙的站点中,您实际上需要为应用程序分配多个工作进程,但这意味着您拥有所需的硬件(CPU内核和内存)

  • 调度程序是Quartz.net,id显示为“scheduler_Worker-10”,而不仅仅是一个数字

  • 线程可以有名称而不是ID。如果为线程分配了一个名称,那么您将看到该名称而不是id。当然,对于线程,您没有这样的控制权。请注意,我没有使用(也不知道Quartz),所以我不知道,但我想是这样。

    我假设每个连接至少分配1个线程,然后可能会为应用程序分配几个主线程(以接受连接、管理全局应用程序状态等)。我不是把这当作一个答案,因为这只是一个猜测。看到了吗