单例类计数归零是IIS进程回收造成的吗?假如是的话,
IIS进程回收是否过于频繁,是不是也可以作为:选择web空间的一个条件?
我研究这个源于这个问题:http://bbs.csdn.net/topics/390743745
我在某空间提供商处,租用了一个香港的100M的web空间,隔一段时间不访问,等再次访问时,就会觉得特别慢,于是我写了个程序进行测试:
我不确定此现象是IIS回收造成的。请大神们指正:
SingleInstance 是一个单例类,如果程序不被回收的话, 数字应该一直累加,可是我那个破空间,有2分钟不访问,等再次访问,数字就变为0!!
这能说明什么?? 他设置的话,不可能设置2分钟吧? 说明他服务器上跑的程序太多了?
我在其他其他空间里实验,大概是几个小时!!
namespace WebApplication1 { /// <summary> /// 单例模式 为了检验 /// </summary> public class SingleInstance { private static SingleInstance instance = new SingleInstance(); public int I { get; set; } private SingleInstance() { } public static SingleInstance GetInstance() { return instance; } } }
<script runat="server"> protected void Page_Load(object sender, EventArgs e) { WebApplication1.SingleInstance sig = WebApplication1.SingleInstance.GetInstance(); sig.I++; Label1.Text = sig.I.ToString(); } </script> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>启动整个网站</title> </head> <body> <form id="form1" runat="server"> <div> 你是第 <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>个访问者 </div> </form> </body> </html>
IIS自动回收造成的
IIS会自动回收的
注册App启动停止事件,将这个计数保存到一个文件中.或者数据库中
总之就是在启动和停止将计数持久化
“App启动停止事件”咋注册啊?查了半天没查到!!!
@钢的锅: apelikeisun sida(读音)和end 事件
你这个单例模式本身线程就不够安全。
你拥有的静态成员没有继承IDisposable接口,所以不存在回收
。
拥有的静态成员为static的时候,只要该成员的值不为null或者没有被其他成员引用,又或者appdomain被卸载或者结束,他们永远不会被GC回收。
你这个原因我总结了两个
1.线程安全
2.远程IIS服务器强制人工回收了(估计是商家强制做了这个动作)。
不过,你可以本机测试一下。
你可以参考我的单例模式
public sealed class Singleton { Singleton() { } public static Singleton Instance { get { return Nested.instance; } } class Nested { // Explicit static constructor to tell C# compiler // not to mark type as beforefieldinit static Nested() { } internal static readonly Singleton instance = new Singleton(); } }
补充一下:你这个 public int I { get; set; } 是个非静态或非常量成员,GC是需要回收的。你把它改成static是不会回收的。
wongdavid 童鞋,你搞错了,你说的是内存回收,我说的是 进程回收,两码事!!
@钢的锅: 请搞清楚IIS进程回收和gc垃圾回收的概念及工作原理,再来说我错没错。