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

时间:2009-10-13 15:36:02

标签: c# multithreading static

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

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

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

2 个答案:

答案 0 :(得分:15)

每个请求不是AppDomain。如果要使用特定于线程的状态,请尝试:

[ThreadStatic]
private static int foo;
public static int Foo {get {return foo;} set {foo = value;}}

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

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

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

答案 1 :(得分:8)

Marc所说的是最容易被你追求的东西,但是ASP.NET实际上比ThreadStatic更复杂,因为单个请求实际上可以由多个线程处理..我相信ASP会发生什么.NET是明确地执行线程切换上下文,当然主机环境是调度线程,它有httpcontext需要执行的上下文,所以它找到一个线程,告诉线程应该运行哪个上下文。然后将它发送出去。

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