关于静态变量初始化的问题

时间:2022-04-18 19:44:25
我有一个类,类里边有一个静态变量,该类还会有一个静态构造对于该变量进行初始化,同时该构造会使用log4net生成日志文件。 代码如下:

 public class StaticVar
    {
        private static int test;
        static StaticVar()
        {
            log4net.Config.XmlConfigurator.Configure();

            log4net.ILog logger = log4net.LogManager.GetLogger("File");
            logger.Info("自定义记录错误日志:222222222222" + DateTime.Now.ToString());

            test = 0;
        }
        public static int Get()
        {
            test = test + 1;
            return test;
        }
    }


现在有这样的问题,每次我访问日志生成的记事本文档,静态变量就会被初始化(也就是说,该静态构造又被重新调用),请问是什么原因?是否可以解决?或者说由于我C#基础不好才造成理解有了问题?

13 个解决方案

#1


楼主选的分类是ASP.NET,web应用程序经常会被重启,很正常。

#2


每次访问都会初始化,关闭了浏览器就释放对象了,就算是static也不行。


要保留全局变量 你可以试试在application_start中写

#3


引用 1 楼 KarasCanvas 的回复:
楼主选的分类是ASP.NET,web应用程序经常会被重启,很正常。


但是我并没有主动的重新启动WEB服务,只是打开了一下bin中生成的日志文档而已。

#4



        public class StaticVar
        {
            private static int test;
            static StaticVar()
            {
                test = 0;
            }
            public static int Get()
            {
                test = test + 1;
                return test;
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            StaticVar.Get();
        }

这么用没错,你肯定用错了

#5


引用 3 楼 lixiaolian7 的回复:
引用 1 楼 KarasCanvas 的回复:楼主选的分类是ASP.NET,web应用程序经常会被重启,很正常。

但是我并没有主动的重新启动WEB服务,只是打开了一下bin中生成的日志文档而已。


日志应该放在App_Data目录,更改bin目录内的文件也会导致应用程序重启.

#6


引用 2 楼 still_melody 的回复:
每次访问都会初始化,关闭了浏览器就释放对象了,就算是static也不行。


要保留全局变量 你可以试试在application_start中写


static是可以全局共享的。
我拿两个不同的浏览器测试了。确实是可以共享使用static了。
只是一打开日志文件,那么静态构造就又会重新运行了。

#7


引用 5 楼 KarasCanvas 的回复:
引用 3 楼 lixiaolian7 的回复:引用 1 楼 KarasCanvas 的回复:楼主选的分类是ASP.NET,web应用程序经常会被重启,很正常。

但是我并没有主动的重新启动WEB服务,只是打开了一下bin中生成的日志文档而已。

日志应该放在App_Data目录,更改bin目录内的文件也会导致应用程序重启.


1.我是web项目引用的一个数据访问的类库项目,在类库项目中存放着我的静态方法。
2.配置log4net能配置存储至App_Data文件中吗?
3.实际上我并没有更改bin目录内文件,只是打开了一下…

#8


web应用程序被重启,静态字段被初始化,都应该视为正常情况。即使你不动bin目录,iis也会定期回收应用程序池

#9


用单例模式就可以了


 public class StaticVar    
 {         
    private static volatile StaticVar instance = null;
    private static object lockHelper = new object();
  private static int test;         
  private StaticVar()         
{             
log4net.Config.XmlConfigurator.Configure();               
log4net.ILog logger = log4net.LogManager.GetLogger("File");             
logger.Info("自定义记录错误日志:222222222222" + DateTime.Now.ToString());               
test = 0;         
}         
public int Get()         
{             
test = test + 1;             
return test;         
}  
/// <summary>
/// 单体模式返回当前类的实例
/// </summary>
/// <returns></returns>
public static StaticVar GetStaticVar()
{
if (instance == null)
{
lock (lockHelper)
{
if (instance == null)
{
instance =  new Hard();
}
}
}
return instance;



StaticVar sv=StaticVar.GetStaticVar();

Response.Write("sv1="+ sv.Get() +"<br/>");

StaticVar sv2=StaticVar.GetStaticVar();

Response.Write("sv2="+ sv2.Get() +"<br/>");

#10


instance =  new Hard();  改成 instance =  new StaticVar();

#11


引用 8 楼 KarasCanvas 的回复:
web应用程序被重启,静态字段被初始化,都应该视为正常情况。即使你不动bin目录,iis也会定期回收应用程序池


其实我的实际项目中,是一个wcf服务…当然也是发布在IIS下的。

发现一个奇怪的问题,我在bin目录中,自己新建了一个文本文档。重新打开后,静态变量并没有被初始化。看来应该得从log4net中入手去解决这个问题了。

#12


引用 11 楼 lixiaolian7 的回复:
引用 8 楼 KarasCanvas 的回复:web应用程序被重启,静态字段被初始化,都应该视为正常情况。即使你不动bin目录,iis也会定期回收应用程序池

其实我的实际项目中,是一个wcf服务…当然也是发布在IIS下的。

发现一个奇怪的问题,我在bin目录中,自己新建了一个文本文档。重新打开后,静态变量并没有被初始化。看来应该得从log4net中入手去解决这……


iis寄宿,实际跟web应用程序一样了。

引用
Why does an application domain recycle?

 

An application domain will unload when any one of the following occurs:

 

    Machine.Config, Web.Config or Global.asax are modified
    The bin directory or its contents is modified
    The number of re-compilations (aspx, ascx or asax) exceeds the limit specified by the <compilation numRecompilesBeforeAppRestart=/> setting in machine.config or web.config  (by default this is set to 15)
    The physical path of the virtual directory is modified
    The CAS policy is modified
    The web service is restarted
    (2.0 only) Application Sub-Directories are deleted (see Todd’s blog http://blogs.msdn.com/toddca/archive/2006/07/17/668412.aspx for more info)

http://blogs.msdn.com/b/tess/archive/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles.aspx

#13


非常感谢大家。
已经解决了,是log4net生成的日志文件的问题,生成的日志不存入Bin中就可以了。
至于为什么这样,不太清楚…

#1


楼主选的分类是ASP.NET,web应用程序经常会被重启,很正常。

#2


每次访问都会初始化,关闭了浏览器就释放对象了,就算是static也不行。


要保留全局变量 你可以试试在application_start中写

#3


引用 1 楼 KarasCanvas 的回复:
楼主选的分类是ASP.NET,web应用程序经常会被重启,很正常。


但是我并没有主动的重新启动WEB服务,只是打开了一下bin中生成的日志文档而已。

#4



        public class StaticVar
        {
            private static int test;
            static StaticVar()
            {
                test = 0;
            }
            public static int Get()
            {
                test = test + 1;
                return test;
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            StaticVar.Get();
        }

这么用没错,你肯定用错了

#5


引用 3 楼 lixiaolian7 的回复:
引用 1 楼 KarasCanvas 的回复:楼主选的分类是ASP.NET,web应用程序经常会被重启,很正常。

但是我并没有主动的重新启动WEB服务,只是打开了一下bin中生成的日志文档而已。


日志应该放在App_Data目录,更改bin目录内的文件也会导致应用程序重启.

#6


引用 2 楼 still_melody 的回复:
每次访问都会初始化,关闭了浏览器就释放对象了,就算是static也不行。


要保留全局变量 你可以试试在application_start中写


static是可以全局共享的。
我拿两个不同的浏览器测试了。确实是可以共享使用static了。
只是一打开日志文件,那么静态构造就又会重新运行了。

#7


引用 5 楼 KarasCanvas 的回复:
引用 3 楼 lixiaolian7 的回复:引用 1 楼 KarasCanvas 的回复:楼主选的分类是ASP.NET,web应用程序经常会被重启,很正常。

但是我并没有主动的重新启动WEB服务,只是打开了一下bin中生成的日志文档而已。

日志应该放在App_Data目录,更改bin目录内的文件也会导致应用程序重启.


1.我是web项目引用的一个数据访问的类库项目,在类库项目中存放着我的静态方法。
2.配置log4net能配置存储至App_Data文件中吗?
3.实际上我并没有更改bin目录内文件,只是打开了一下…

#8


web应用程序被重启,静态字段被初始化,都应该视为正常情况。即使你不动bin目录,iis也会定期回收应用程序池

#9


用单例模式就可以了


 public class StaticVar    
 {         
    private static volatile StaticVar instance = null;
    private static object lockHelper = new object();
  private static int test;         
  private StaticVar()         
{             
log4net.Config.XmlConfigurator.Configure();               
log4net.ILog logger = log4net.LogManager.GetLogger("File");             
logger.Info("自定义记录错误日志:222222222222" + DateTime.Now.ToString());               
test = 0;         
}         
public int Get()         
{             
test = test + 1;             
return test;         
}  
/// <summary>
/// 单体模式返回当前类的实例
/// </summary>
/// <returns></returns>
public static StaticVar GetStaticVar()
{
if (instance == null)
{
lock (lockHelper)
{
if (instance == null)
{
instance =  new Hard();
}
}
}
return instance;



StaticVar sv=StaticVar.GetStaticVar();

Response.Write("sv1="+ sv.Get() +"<br/>");

StaticVar sv2=StaticVar.GetStaticVar();

Response.Write("sv2="+ sv2.Get() +"<br/>");

#10


instance =  new Hard();  改成 instance =  new StaticVar();

#11


引用 8 楼 KarasCanvas 的回复:
web应用程序被重启,静态字段被初始化,都应该视为正常情况。即使你不动bin目录,iis也会定期回收应用程序池


其实我的实际项目中,是一个wcf服务…当然也是发布在IIS下的。

发现一个奇怪的问题,我在bin目录中,自己新建了一个文本文档。重新打开后,静态变量并没有被初始化。看来应该得从log4net中入手去解决这个问题了。

#12


引用 11 楼 lixiaolian7 的回复:
引用 8 楼 KarasCanvas 的回复:web应用程序被重启,静态字段被初始化,都应该视为正常情况。即使你不动bin目录,iis也会定期回收应用程序池

其实我的实际项目中,是一个wcf服务…当然也是发布在IIS下的。

发现一个奇怪的问题,我在bin目录中,自己新建了一个文本文档。重新打开后,静态变量并没有被初始化。看来应该得从log4net中入手去解决这……


iis寄宿,实际跟web应用程序一样了。

引用
Why does an application domain recycle?

 

An application domain will unload when any one of the following occurs:

 

    Machine.Config, Web.Config or Global.asax are modified
    The bin directory or its contents is modified
    The number of re-compilations (aspx, ascx or asax) exceeds the limit specified by the <compilation numRecompilesBeforeAppRestart=/> setting in machine.config or web.config  (by default this is set to 15)
    The physical path of the virtual directory is modified
    The CAS policy is modified
    The web service is restarted
    (2.0 only) Application Sub-Directories are deleted (see Todd’s blog http://blogs.msdn.com/toddca/archive/2006/07/17/668412.aspx for more info)

http://blogs.msdn.com/b/tess/archive/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles.aspx

#13


非常感谢大家。
已经解决了,是log4net生成的日志文件的问题,生成的日志不存入Bin中就可以了。
至于为什么这样,不太清楚…