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发生更改。
答
每个请求都有自己的工作线程。
async
的每个await
方法都有机会在单个请求期间切换线程。
即使您的代码(通常是管道步骤的中间部分)不使用异步/等待,ASP.Net管道的早期/后期步骤也可能会针对单个请求交换线程。
我很确定他们来自同一个Web请求。我是在测试环境下做的,而且我只调用一次Web服务调用。 Web服务方法还有一个Monitor.TryEnter,可以防止多个Web请求调用同时运行相同的代码。另外,生成这些注释的代码彼此非常接近。 – dsum