我在web程序中
namespace myweb
{
public class function
{
public static bool channel_flag=false;
public static void channelname_init()
  {
    channel_flag=true;
  }
}
}页面中
if (!myweb.function.channel_flag)
{
    myweb.function.channelname_init();
}
我的原意是只要有一个浏览者触发了channelname_init()
其他人就不用再触发了。但是每隔3-7分钟function.channel_flag又会=false
又会有人触发channelname_init()我知道重启IIS,修改web.config,和Recycle Application Pool会回收内存(服务器是windows 2003),并初始化static 变量。
但我确定,以上都没发生,为什么static 变量还是被初始化了呢?

解决方案 »

  1.   

    我知道重启IIS,修改web.config,和Recycle Application Pool会回收内存(服务器是windows 2003),
    还有覆盖bin目录,修改程序文件等,会初始化static 变量。 但我确定,以上都没发生,一直在运行中,没改动任何东西,为什么static 变量还是被初始化了呢? 
      

  2.   

    你是怎么确定的?Application_Init 看看呢
      

  3.   

    應該是有人實例化了public class function 吧我的原意是只要有一个浏览者触发了channelname_init() 
    其他人就不用再触发了。
      那還不如直接就寫死成 public static bool channel_flag=true; 
      

  4.   

    静态的是 Type 上的, 在一个 AppDomain 内第一次访问该 Type 的时候 赋值
      

  5.   

    不直接寫死成 public static bool channel_flag=true; 
    是因为channelname_init() 
    是数据库初始化方法。读一个数据库,给后来所有的浏览者看。
    namespace myweb 

    public class function 

    public static bool channel_flag=false; 
    public static void channelname_init() 
      { 
        数据库初始化读到Cache
        channel_flag=true; //标志位,说明已经初始化完成,下一个浏览者看到channel_flag=true,直接调用Cache,而不必读数据库。
      } 


      

  6.   

    Web是无状态的
    一个用户浏览一次你的网站,网站运行一次程序,生成应答后就把资源释放了
    你要保存一个变量的话,试试用Application[变量名]=false;
    然后一个用户点击一次后将它赋值为true 
    之后在Session_Start函数中设置定时,3-7分钟后将它赋值为false
    这样或许就能满足你的要求了吧
      

  7.   


    迄今为止,包括微软官方资料在内,还没有人能够说出所有可能造成web应用程序重启的原因。web应用程序重启是一个正常的维护行为,很多原因都可能造成,例如我可以设置当连接数达到500的时候就重启一次,或者每当剩余物理内存小于500M的时候就重启一次,等等。编写asp.net程序,就要假设服务器每当几分钟就在你处理完页面后立刻自动重启一次,这样才能写出真正可靠的web应用程序。这是对合格的asp.net应用程序的基本要求,我会这样验收任何asp.net程序。
      

  8.   

    我在public static void channelname_init() 里加了HttpRuntime.Cache.Insert("channel_flag", "hahaha");
      { 
        数据库初始化读到Cache 
        channel_flag=true; //标志位,说明已经初始化完成,下一个浏览者看到channel_flag=true,直接调用Cache,而不必读数据库。 
        HttpRuntime.Cache.Insert("channel_flag", "hahaha");
      } 
    看看下次channel_flag被初始化的时候,HttpRuntime.Cache["channel_flag"] 是不是== null
    如果==null说明内存被释放了,如果HttpRuntime.Cache["channel_flag"].ToString()==“hahaha”,
    那就说明内存没被释放,static变量却初始化了。先等着看看日志吧。
      

  9.   

    果然是内存被回收了。HttpRuntime.Cache["channel_flag"]== null 
    channel_flag==false
    完全是初始化时的状态。
    但是w3wp.exe进程CUPtime不是0:00:00,Mem Usage还是400多MB,说明没有重启啊,内存也没有降下去啊。
      

  10.   

    最简单的就是不同IP对同一页面请求就会重新给static变量赋新值...
      

  11.   

    用channel_flag 来标识是否加载过缓存,相当不可靠,且复杂化,很容易出现这样的问题,channel_flag被改成false了,但是缓存已经加载过了,channel_flag还保留着true值,但是缓存已经被清楚了(比如别的地方更新数据库)其实我认为这个标识的设计完全是多余的,对于应用层来说,
    根本不用关心缓存有没有数据,只管从缓存取数据就行了,而对于数据提供层来说,被调用时候就只需检查一下缓存,如果缓存没有就从数据库填充进去。举个简单例子: 
     aspx 页面读取新闻数据DataTable  news = DataAccess.GetNews();
    DataAccess.cs
    {
      //构造函数,检查cache,如空则填充
      DataAccess()
      {
         
       }
     static DataTable GetNews()
    {
      return cache["news"] as Datatable;
    }
      

  12.   


    UP..这个是标准答案。。你这种用static保存全局变量的方法是不太可行的。。可以放到Cache中,或者Application中..