Web中线程与IIS线程池自动回收机制

     开发Web项目后,部署到 IIS上 ,运行一直稳定,当Web程序中加入了定时任务,或者线程之类的机制后,第二天发现悲催了,定时任务并没有执行,此时重新登录一下网站,定时任务又重新执行。原来IIS默认有回收线程池机制,当网站一段时间没有人访问时,会自动回收,项目中的线程、进程自然而然就被终止掉了。而以前类似于定时任务,线程之类的都是用控制台程序写,然后打包成服务运行在Windows上,只要服务不终止,里面的线程就会一直运行下去,不会存在所谓的运行一段时间就被回收的情况。晚上搜索了解决线程池回收问题,主流方案是修改IIS 程序池的默认设置,将 固定时间间隔设置0,闲置超时设为0 ,即对此IIS项目不进行回收,也就不存在定时任务,线程程序被终止的情况。对 IIS 详细的参数一知半解,这次补习了一下功课,有时候 IIS参数的设置 也是对程序的一种有效优化.

 

 

      要知道,IIS自动回收相当于服务器IIS重启,应用程序池内存清空,所有数据被清除,相当于IIS重启,如果手动进行干预,使IIS程序不再进行回收,久而久之,可能会使程序运行变慢, 甚至会内存溢出,总归是心有不安。反过来想,担心程序自动回收后,线程之类的会被终止,此时只有重新登录网站,线程才会自动去运行。也就是说,如果在程序池回收后保证运行一次网站的运行就可。说白了就是回收后进行一次URL的请求,线程池回收后会进入 Application_End ,那么将访问URL的方法写入到Application_End 中即可。如下图所示

        protected void Application_End(object sender, EventArgs e)
        {
            //写进日志队列
            LogHelper.InfoLogQueue.Enqueue("Application_End");
            Thread.Sleep(3000);
            //这里设置你的web地址,可以随便指向你的任意一个aspx页面,激发Application_Start       
            string url = "http://Home/Update";
            HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
            HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
            Stream receiveStream = myHttpWebResponse.GetResponseStream();//得到回写的字节流 
        }

也就是说,程序池回收后去请求了一次URL,首先会进入到 Application_Start 方法中,则在此方法中加入 定时任务,线程之类的操作就很合适,试想,程序池回收后,定时任务线程终止,然后去请求一次URL,线程开启,如此往复

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
                      
            //开启日志
            LogHelper Log = new LogHelper();
            Log.Process();         
            //开始记录
            LogHelper.InfoLogQueue.Enqueue("Application_Start");
            //开启定时任务         
            AutoTask();
        }

对于以前接手的 web 程序中,使用线程之类的很少用到, 像线程、定时任务多用控制台程序包装成服务,但是也保不齐有Web中用到,这里记录一下

 

posted @ 2019-12-09 15:28  郎中令  阅读(...)  评论(...编辑  收藏