首页 新闻 会员 周边

单例类计数归零是IIS进程回收造成的吗?

0
悬赏园豆:20 [已解决问题] 解决于 2014-08-29 10:21

        单例类计数归零是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>
钢的锅的主页 钢的锅 | 初学一级 | 园豆:10
提问于:2014-05-07 01:57
< >
分享
最佳答案
0

IIS自动回收造成的

收获园豆:20
于为源 | 小虾三级 |园豆:956 | 2014-05-07 07:56
其他回答(3)
0

 IIS会自动回收的

木乌 | 园豆:1015 (小虾三级) | 2014-05-07 08:36
0

注册App启动停止事件,将这个计数保存到一个文件中.或者数据库中

总之就是在启动和停止将计数持久化

吴瑞祥 | 园豆:29449 (高人七级) | 2014-05-07 10:26

“App启动停止事件”咋注册啊?查了半天没查到!!!

支持(0) 反对(0) 钢的锅 | 园豆:10 (初学一级) | 2014-05-07 12:01

@钢的锅: apelikeisun sida(读音)和end  事件

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-05-07 13:44
0

你这个单例模式本身线程就不够安全。

你拥有的静态成员没有继承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 | 园豆:394 (菜鸟二级) | 2014-05-07 15:47

wongdavid 童鞋,你搞错了,你说的是内存回收,我说的是 进程回收,两码事!!

支持(0) 反对(0) 钢的锅 | 园豆:10 (初学一级) | 2014-05-08 00:28

@钢的锅: 请搞清楚IIS进程回收和gc垃圾回收的概念及工作原理,再来说我错没错。

支持(0) 反对(0) wongdavid | 园豆:394 (菜鸟二级) | 2014-05-08 01:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册