IIS应用程序池是否切换工作线程?

时间:2015-08-14 17:19:05

标签: c# iis log4net

我在IIS 8应用程序池上托管了一个Web服务。我正在使用log4net进行登录。

我正在检查日志文件中的某些条目,并注意到线程ID已更改。

以下是两个日志条目

<event logger="ManageStaticData" 
       timestamp="2015-08-14T03:00:00.0597938-06:00" 
       level="INFO" 
       thread="5916" 
       domain="Webservice" 
       username="IIS APPPOOL\WebServices">
  <message>Start of static data load.</message>
  <global-properties>
    <data name="log4net:HostName" value="CC" />
  </global-properties>
</event>
<event logger="ManageStaticData" 
       timestamp="2015-08-14T03:00:00.3410242-06:00" 
       level="DEBUG" 
       thread="eba102cb-8224-426e-a2b1-f4e984d4dea7" 
       domain="Webservice" 
       username="IIS APPPOOL\WebServices">
  <message>Found 1 schedule to be load</message>
  <global-properties>
    <data name="log4net:HostName" value="CC" />
  </global-properties>
</event>

显示这两条日志消息的代码路径只能来自同一方法。

请注意,线程值从“5916”更改为GUID。

大约6秒后,我注意到5916线程开始记录其他Web服务调用。具有GUID的线程不再记录。

为什么线程值会发生变化? log4net是否使用工作线程来记录条目?或者IIS在某个过程中以某种方式切换工作线程,听起来不太可能?或者它是相同的线程,但已重命名?

2 个答案:

答案 0 :(得分:1)

每个请求在进入时都会分配给可用线程。由于日志条目代表两个单独的Web请求,因此线程ID已更改。

答案 1 :(得分:1)

每个请求都有自己的工作线程。

await方法的每个async都有机会在单个请求期间切换线程。

即使您的代码(通常是管道步骤的中间)不使用async / await,ASP.Net管道的早期/晚期步骤也可能会切换线程以获得单一请求。