HttpContext.Current如何在多线程环境中工作?

Joe*_*nez 12 c# static multithreading

所以我想知道asp.net是如何确定范围静态属性的,当(据我所知)asp.net是多线程的.

  • 一种理论认为,ASP.NET人员为每个请求维护一个不同的appdomain ...但这似乎不可行.
  • 另一种理论认为.Current方法查看当前的Thread,然后使用它来查找某些哈希表(或其他静态存储机制)中的http上下文.

无论哪种方式,这是一种看似非常有用的技术......我想利用它,但绝对不想调试共享状态错误: - /

Mar*_*ell 15

这不是AppDomain按要求.如果要使用特定于线程的状态,请尝试:

[ThreadStatic]
private static int foo;
public static int Foo {get {return foo;} set {foo = value;}}
Run Code Online (Sandbox Code Playgroud)

每个线程现在都有自己的值Foo(或者更确切地说:'foo').

不是轻易使用的 - 它确实有成本,但是在每个线程的基础上共享状态的有效方式.我曾经使用过一次,也许两次 - 而且我写了很多C#.不要过度使用它......

特别要注意初始化问题(即忘记这样做),并记住要自己清理等等.如果你使用任何异步代码,要非常小心,因为任何回调/工人/等都会有不同的状态.

  • 需要注意的是,ThreadStatic在高负载情况下不可靠.ASP.NET切换请求线程之间的上下文并迁移HttpContext.任何[ThreadStatic]都会留在旧线程上,这会获取新请求. (3认同)

mea*_*ode 8

Marc所说的是最容易被你追求的东西,但是ASP.NET实际上比ThreadStatic更复杂,因为单个请求实际上可以由多个线程处理..我相信ASP.NET所发生的事情是表示执行线程明确地被告知要切换上下文,当然托管环境正在调度线程,它有httpcontext需要执行的上下文,所以它找到一个线程,告诉线程它应该运行哪个上下文..然后发送它在途中.

所以解决方案真的不是那么令人遗憾,因为线程静止更简单,并且可能适合95%的时间需要.