gpt4 book ai didi

asp.net - HttpApplication事件更改线程

转载 作者:行者123 更新时间:2023-12-03 12:52:24 26 4
gpt4 key购买 nike

为了记录ASP.NET Web应用程序,我将一些状态信息保留在静态类中。这些字段被标记为[ThreadStatic],因此每个线程都有其自己的字段副本。从HttpApplication事件方法中调用日志记录方法:

  • Application_BeginRequest(请求开始,初始化状态)
  • Application_AcquireRequestState(已知 session 和用户)
  • Application_EndRequest(请求结束,清理)

  • 我现在可以观察到,在某些情况下,页面请求是在不同的线程中处理的。 BeginRequest事件在线程18上运行,而以下事件在线程4上运行。当然,我的线程静态数据然后不可用,并且发生错误。

    在大多数情况下,这工作得很好,并且每个请求仅在单个线程中处理。但是,当我请求加载约5秒的页面并在1-2秒后单击另一个链接时,两个请求都并行运行。第一个在5秒钟后在线程24(也从那里开始)上完成,另一个在线程18上开始,但是在第一个请求完成之后,第二个继续在线程4上运行。

    尝试3个重叠的长请求,这是一个纯粹的困惑。我什至可以看到从同一线程开始的两个请求,而每个请求随后在不同的线程中继续。请求和线程之间似乎没有任何关系。

    一个请求正在更改线程怎么可能?如果它决定继续前进到另一个线程,它将失去所有状态。我所能找到的每个描述都说,所有这些都发生在单个线程中。

    IIS 7,Windows Server 2008 R2,x64上的ASP.NET 4.0。

    替代方法:如果我不能仅依靠从头到尾在单个线程中处理的请求,那么存储少量每个请求数据(当前为整数和一个类)的最佳位置是什么?存取速度非常快?并且最好在不引用System.Web的情况下也可以工作(我的代码也以客户端配置文件为目标)。我知道 HttpContext.Current.Items[key],但是在远程处理程序集的某个地方查找了它,并且涉及到一个字典,该字典似乎比线程静态字段慢很多。

    最佳答案

    ASP.NET是thread agile,一个请求可以在多个线程上处理(但一次最多可以处理一个线程)。因此,您实际上不能在ASP.NET中使用ThreadStatics。但是,您可以安全地使用HttpContext.Items字典来存储需要限制在单个请求范围内的内容。

    为了使您的代码在ASP.NET应用程序的上下文之外运行,可以创建一个包装程序,该包装程序根据代码所在的环境来交换HttpContext/CallContext。Here is an example of such a wrapper

    关于asp.net - HttpApplication事件更改线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24083360/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com