zoukankan      html  css  js  c++  java
  • 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中用到,这里记录一下

  • 相关阅读:
    Fastify 系列教程四 (求对象、响应对象和插件)
    Fastify 系列教程三 (验证、序列化和生命周期)
    Fastify 系列教程二 (中间件、钩子函数和装饰器)
    Fastify 系列教程一 (路由和日志)
    使用 Vuejs 开发 chrome 插件的注意事项
    五十行javascript代码实现简单的双向数据绑定
    markown编辑器截图粘贴预览,并将图片传至七牛云
    线程与进程的区别
    TeamViewer卡在正在初始化显示参数
    Chrome 字体模糊解决
  • 原文地址:https://www.cnblogs.com/Sientuo/p/12011287.html
Copyright © 2011-2022 走看看