代码之家  ›  专栏  ›  技术社区  ›  Jeff

做ASP.NET请求总是在同一线程上开始请求和结束请求?

  •  3
  • Jeff  · 技术社区  · 14 年前

    BeginRequest和EndRequest是否ASP.NET对于来自客户端的给定HTTP请求,HttpApplication总是发生在完全相同的线程上?

    我问这个问题的原因是我看到了一些非常奇怪的行为,其中ThreadStatic变量在IHttpModule的Init方法中不是null。

    但是,我的IHttpModule Init方法应该在BeginRequest/EndRequest期间之外调用,因此我认为调用我的Init方法时,这个ThreadStatic变量将有一个值的唯一方法是如果EndRequest发生在不同于BeginRequest的线程上,因此当ASP.NET尝试使用时,该值仍然不是null同一个线程创建一个新的HttpApplication实例。。。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Richard    14 年前

    对于来自客户端的给定HTTP请求,ASP.NET HttpApplication的BeginRequest和EndRequest是否总是发生在完全相同的线程上?

    不可以。在请求中有一些选项可以执行异步操作,从而导致在不同线程上处理的请求结束。这不是正常情况。

    请参见的Async属性 @Page 指令: http://msdn.microsoft.com/en-us/library/ydy4x04a.aspx

    有关使用异步页面的介绍,请参阅MSDN杂志的文章:“ Asynchronous Pages in ASP.NET 2.0 ".

        2
  •  1
  •   Jeff    14 年前

    好笑的是我以前犯过这个错误,所以我应该知道得更清楚…但是唉。

    ThreadStatic成员必须是静态的。它真的应该抛出一个编译器错误,如果它不是。。。

        3
  •  0
  •   Community CDub    8 年前

    Richard's answer .

    HttpContext.Current.Items . 如果是 [ThreadStatic] 线程敏捷性 在ASP.NET不能保证代码在同一个线程上开始和结束。所以, ThreadStatic 这不是个好主意吗ASP.NET.

    值得这么说 EndRequest HttpContext .

    这似乎是关于使用[ThreadStatic]和HttpContext的最后一篇文章 http://piers7.blogspot.co.nz/2005/11/threadstatic-callcontext-and_02.html


    http://www.hanselman.com/blog/ATaleOfTwoTechniquesTheThreadStaticAttributeAndSystemWebHttpContextCurrentItems.aspx

    Jon Skeet也有一个很好的答案:
    CallContext vs ThreadStatic