我在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在某个过程中以某种方式切换工作线程,听起来不太可能?或者它是相同的线程,但已重命名?
答案 0 :(得分:1)
每个请求在进入时都会分配给可用线程。由于日志条目代表两个单独的Web请求,因此线程ID已更改。
答案 1 :(得分:1)
每个请求都有自己的工作线程。
await
方法的每个async
都有机会在单个请求期间切换线程。
即使您的代码(通常是管道步骤的中间)不使用async / await,ASP.Net管道的早期/晚期步骤也可能会切换线程以获得单一请求。