所以我想知道asp.net是如何确定范围静态属性的,当(据我所知)asp.net是多线程的。
无论哪种方式,这是一种看似非常有用的技术......我想利用它,但绝对不想调试共享状态错误: - /
答案 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%的时间。