当前位置: 代码迷 >> C# >> asp.net Global文件Application_Start事件,该如何解决
  详细解决方案

asp.net Global文件Application_Start事件,该如何解决

热度:43   发布时间:2016-05-05 03:41:50.0
asp.net Global文件Application_Start事件
本帖最后由 wangjun8868 于 2015-05-20 09:35:19 编辑

 Socket socket;
        Thread thread;
        void Application_Start(object sender, EventArgs e)
        {
            // 在应用程序启动时运行的代码
            //用SOCKET测试
            int port = 6000;
            string host = "192.168.1.101";
            IPAddress ip = IPAddress.Parse(host);
            IPEndPoint ipe = new IPEndPoint(ip, port);
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
            socket.Connect(ipe);//连接到服务器
            thread = new Thread(new ThreadStart(Send));
            thread.IsBackground = true;
            thread.Start();
        }
        public void Send()
        {
            while (true)
            {
                try
                {
                    if (socket != null)
                    {
                        string sendStr = "这是测试生命周期的字符串!";
                        byte[] bs = Encoding.UTF8.GetBytes(sendStr);
                        socket.Send(bs, 0, bs.Length, 0);//发送测试信息
                        Thread.Sleep(1000 * 60);//一分钟一次
                    }
                }
                catch (Exception ex)
                {

                }
            }
        }
        void Application_End(object sender, EventArgs e)
        {
            //  在应用程序关闭时运行的代码

        }

        void Application_Error(object sender, EventArgs e)
        {
            // 在出现未处理的错误时运行的代码

        }

上面的代码在服务端检测,20分钟 客户端就退出了,
除非保持页面会话,每隔几分钟webrequest 请求 网页,要不SOCKET就20分钟退出了(这时间貌似是SESSION的生命周期),
怎么能保持SOCKET对象持久不退出(意外情况退出不用考虑)!

WCF建立一个服务能保持持久化吗?
------解决思路----------------------
这种一般用windows service. 
------解决思路----------------------
你这个貌似并没有关联到session
其实还有一个20分钟,在应用程序池的高级属性中,默认20分钟不活动(没收到请求),程序池的工作进程就会自动回收,直到收到下次请求时再开启
也就是下文中第4个设置项,工作进程的闲置回收时间(默认20分钟)
http://blog.csdn.net/rryqsh/article/details/8156558


------解决思路----------------------
也不建议把所有的回收策略都禁用,回收可以很好地保证站点持续稳定运行
一般国内的站点可以设置每天凌晨某个时候回收就行了
------解决思路----------------------
引用:
Quote: 引用:

这种一般用windows service. 

大神 你能不能再明示一下


就是把你在app_start中的代码放到一个windows service中去执行。windows service在操作系统运行时一直在运行。
------解决思路----------------------
msdn有教程:

Walkthrough: Creating a Windows Service Application in the Component Designer
https://msdn.microsoft.com/en-us/library/zt39148a(v=vs.110).aspx
------解决思路----------------------
过期的不是Session,应该是应用程序池的工作进程被关闭了。在IIS里,针对应用程序池有一个空闲超时的设置,默认为20分钟,也就是在20分钟内如果没有任何请求到达IIS,进程就会被关闭,自然你的Socket就被关闭了。可以到IIS里关闭这个设置。
------解决思路----------------------
引用:
Quote: 引用:

过期的不是Session,应该是应用程序池的工作进程被关闭了。在IIS里,针对应用程序池有一个空闲超时的设置,默认为20分钟,也就是在20分钟内如果没有任何请求到达IIS,进程就会被关闭,自然你的Socket就被关闭了。可以到IIS里关闭这个设置。

关闭了内存会不会一直增长呢?

那就要看你的程序怎么写了
  相关解决方案