C# Asp.net页生命周期特定的全局变量?

C# Asp.net页生命周期特定的全局变量?,c#,asp.net,vb.net,C#,Asp.net,Vb.net,当然,这肯定是一个常见的问题,但我找不到一个简单的方法来做到这一点 有没有一种方法可以在asp.net webform的整个生命周期中共享一个全局变量(比如说实例化一个昂贵的类),而不必将句柄传递给页面的每个组件 如果我只是创建一个静态变量,那么应用程序域中的所有线程都可以访问它(问题:我的类不是线程安全的),而且很难确保每个页面都在最近的副本上工作(我希望在页面生命周期的每一步都缓存该类,但每次调用新页面时都需要一个新实例) 另一种方法是将句柄传递给页面中的每个控件,但在母版页、页面本身和所有

当然,这肯定是一个常见的问题,但我找不到一个简单的方法来做到这一点

有没有一种方法可以在asp.net webform的整个生命周期中共享一个全局变量(比如说实例化一个昂贵的类),而不必将句柄传递给页面的每个组件

如果我只是创建一个静态变量,那么应用程序域中的所有线程都可以访问它(问题:我的类不是线程安全的),而且很难确保每个页面都在最近的副本上工作(我希望在页面生命周期的每一步都缓存该类,但每次调用新页面时都需要一个新实例)

另一种方法是将句柄传递给页面中的每个控件,但在母版页、页面本身和所有用户控件之间,这会使代码非常复杂

我想知道是否没有一个优雅的解决方案来将类存储在某个只有执行这个特定页面的线程(包括所有子用户控件)才能访问的地方

欢迎任何建议! 谢谢
查尔斯有一个简单的答案:物品容器。它在单个请求的生命周期内可用,然后自动销毁。您可以将其包装在属性中以获得所需的内容:

 public class Foo {

   const string SOMEKEY = "_somekey";

   public static string SingleRequestVariable
   {
      get
      {
          return (string)HttpContext.Current.Items[SOMEKEY];   
      }
      set
      {
          HttpContext.Current.Items.Add( SOMEKEY, value );
      }
   }
 }
然后

Foo.SingleRequestVariable = "bar"; // somewhere
...
string val = Foo.SingleRequestVariable; // yet somewhere else

很好的解决方案!实际上,我可以使用一个静态函数Foo.Current,它进入httpcontext,检查Foo的实例是否已经存在,否则创建一个并添加它,然后返回这个实例。谢谢你的快速回复!只是因为其他人可能会无意中发现这个答案。。。如果在变量集方法中,使用HttpContext.Current.Items[SOMEKEY]=value;然后,如果一个项目不存在,它将创建一个项目;如果它已经存在,它将重置其值。当dictionary类已经为您完成时,无需重新编码。