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

问题描述:

我有IIS 8应用程序池托管的Web服务。我正在使用log4net进行登录。IIS应用程序池切换工作线程吗?

我正在检查日志文件中的一些条目,并注意到线程标识符发生了变化。

下面是两种日志条目

<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在过程中以某种方式切换工作线程,听起来不太可能?或者它是相同的线程,但被重命名?

每个请求都会分配给一个可用的线程。由于日志条目表示两个单独的Web请求,因此线程ID发生更改。

+0

我很确定他们来自同一个Web请求。我是在测试环境下做的,而且我只调用一次Web服务调用。 Web服务方法还有一个Monitor.TryEnter,可以防止多个Web请求调用同时运行相同的代码。另外,生成这些注释的代码彼此非常接近。 – dsum

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

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

即使您的代码(通常是管道步骤的中间部分)不使用异步/等待,ASP.Net管道的早期/后期步骤也可能会针对单个请求交换线程。

+0

您能解释一些关于ASP.NET的早期/后期步骤,可以在不使用异步的情况下切换线程吗?我正在尝试在ASP.NET中查找更多关于线程切换的信息,但到目前为止,他们只会提到它,只发生在使用异步处理程序或异步/等待时。在代码中,它使用Monitor.TryEnter,并使用实体框架来加载数据。 – dsum

+0

我想我找到了切换线程的可能性。日志之间的代码实际上是一个Web服务调用(另一个Web服务)。我需要更多地测试它,但很可能另一个Web服务回到不同的线程上。 – dsum