我一直在想,既然asp.net是多线程的,那么它是如何限定静态属性的作用域的。
- 一个理论认为ASP.NET维护了每个请求的不同应用程序域...但这似乎不可行。
- 另一个理论认为,.Current方法查看当前线程,然后使用它来查找某个哈希表(或其他静态存储机制)中的http上下文。
无论哪种方式,这似乎是一种非常有用的技术...我想利用它,但肯定不想调试共享状态错误 :-/
我一直在想,既然asp.net是多线程的,那么它是如何限定静态属性的作用域的。
无论哪种方式,这似乎是一种非常有用的技术...我想利用它,但肯定不想调试共享状态错误 :-/
这不是每个请求一个AppDomain
。如果你想使用线程特定状态,请尝试:
[ThreadStatic]
private static int foo;
public static int Foo {get {return foo;} set {foo = value;}}
现在每个线程都有自己的Foo
值(或者说是'foo')。
这并不是轻易使用的东西 - 它具有成本,但它是一种按线程共享状态的有效方式。我可能只使用过这个一两次 - 而我已经写了很多C#代码。不要过度使用它...
特别要注意初始化问题(即忘记进行初始化),并记得在使用完后清理自己等等。如果您使用任何异步代码,请非常小心,因为任何回调、工作线程等都将具有不同的状态。
因此,解决方案实际上并不那么美好,而ThreadStatic则简单得多,可能95%的情况都适用。