2015-08-14 76 views
0

我有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在過程中以某種方式切換工作線程,聽起來不太可能?或者它是相同的線程,但被重命名?

回答

1

每個請求都會分配給一個可用的線程。由於日誌條目表示兩個單獨的Web請求,因此線程ID發生更改。

+0

我很確定他們來自同一個Web請求。我是在測試環境下做的,而且我只調用一次Web服務調用。 Web服務方法還有一個Monitor.TryEnter,可以防止多個Web請求調用同時運行相同的代碼。另外,生成這些註釋的代碼彼此非常接近。 – dsum

1

每個請求都有自己的工作線程。

async的每個await方法都有機會在單個請求期間切換線程。

即使您的代碼(通常是管道步驟的中間部分)不使用異步/等待,ASP.Net管道的早期/後期步驟也可能會針對單個請求交換線程。

+0

您能解釋一些關於ASP.NET的早期/後期步驟,可以在不使用異步的情況下切換線程嗎?我正在嘗試在ASP.NET中查找更多關於線程切換的信息,但到目前爲止,他們只會提到它,只發生在使用異步處理程序或異步/等待時。在代碼中,它使用Monitor.TryEnter,並使用實體框架來加載數據。 – dsum

+0

我想我找到了切換線程的可能性。日誌之間的代碼實際上是一個Web服務調用(另一個Web服務)。我需要更多地測試它,但很可能另一個Web服務回到不同的線程上。 – dsum