【问题标题】:Does IIS Application Pool switch worker thread?IIS 应用程序池是否切换工作线程?
【发布时间】:2015-08-14 17:19:05
【问题描述】:

我有一个托管在 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 是否以某种方式在进程中间切换了工作线程,听起来不太可能?或者它是同一个线程,但被重命名了?

【问题讨论】:

    标签: c# iis log4net


    【解决方案1】:

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

    【讨论】:

    • 我很确定它们来自同一个网络请求。我是在测试环境下完成的,我只调用了一次 Web 服务调用。 Web 服务方法还有一个 Monitor.TryEnter 防止多个 Web 请求调用同时运行相同的代码。此外,生成这些 cmets 的代码彼此非常接近。
    【解决方案2】:

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

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

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

    【讨论】:

    • 您能否详细解释一下可以在不使用异步的情况下切换线程的 ASP.NET 的早期/后期步骤?我正在尝试查找有关 ASP.NET 中线程切换的更多信息,但到目前为止,他们只提到它只有在我使用异步处理程序或异步/等待时才会发生。在代码中,它使用 Monitor.TryEnter,并使用 Entity Framework 加载数据。
    • 我想我发现线程被切换的可能性。日志之间的代码实际上进行了 Web 服务调用(另一个 Web 服务)。我需要对其进行更多测试,但很可能另一个 Web 服务会在不同的线程上返回。
    猜你喜欢
    • 2021-04-22
    • 2020-08-28
    • 2020-03-15
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    相关资源
    最近更新 更多