博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 因IIS回收导致定时器失效的解决方案
阅读量:6250 次
发布时间:2019-06-22

本文共 1928 字,大约阅读时间需要 6 分钟。

  1. 首先不要设置iis自动回收,一般设置凌晨1-2点左右回收一次,当凌晨iis回收应用程序池的时候,会调用Application_End,执行里面的代码,  
  2. 重新启动网站,建议定时器的代码放在Session_Start里面,因为  
  3. Application_Start只有再第一个用户访问网站的时候才会触发该方法,通常会在该方法里定义一些系统变量,如聊天室的在线总人数统计,  
  4. 历史访问人数统计的初始化等等均可在这里定义.所以第一次访问的时候会先进入Application_Start,  
  5. 然后再进入Session_Start。但是以后每次访问的时候进入的是Session_Start  
  6. 第一个访问网站的用户会触发该方法.     
  7.   
  8. Application_Start()  
  9.     {  
  10.       
  11.   
  12.     }  
  13. //每个用户访问网站的第一个页面时触发;  
  14.     void Session_Start(object sender, EventArgs e)  
  15.     {  
  16.       LogHelper.WriteInfoLog("触发Session_Start事件,准备执行定时任务:" + DateTime.Now);  
  17.   
  18.       #region 定时任务  
  19.       System.Threading.Thread myTimer = new System.Threading.Thread(new System.Threading.ThreadStart(Timer_Write));  
  20.       myTimer.Start();  
  21.       #endregion  
  22.   
  23.     }  
  24. //网站关闭,或重启时,会触发该方法.  
  25.   
  26.     void Application_End(object sender, EventArgs e)  
  27.     {  
  28.       //下面的代码是关键,可解决IIS应用程序池自动回收的问题  
  29.       System.Threading.Thread.Sleep(1000);  
  30.       //触发事件, 写入提示信息  
  31.       LogHelper.WriteInfoLog("触发Application_End事件,正在重新启动网站:" + DateTime.Now);  
  32.       //这里设置你的web地址,可以随便指向你的任意一个页面甚至不存在的页面,目的是要激发Session_Start  
  33.   
  34.       //使用您自己的URL  
  35.       string url = "你的网址";  
  36.       System.Net.HttpWebRequest myHttpWebRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);  
  37.       System.Net.HttpWebResponse myHttpWebResponse = (System.Net.HttpWebResponse)myHttpWebRequest.GetResponse();  
  38.       System.IO.Stream receiveStream = myHttpWebResponse.GetResponseStream();//得到回写的字节流  
  39.   
  40.     }  

 

 

 

 

一、问题描述

  Bs项目中用Quartz功能执行一个定时任务(每隔5分钟执行一个Job),正常情况,Quartz定时任务会5分钟执行一次,但IIS程序池闲置

超时默认为20分钟,造成的结果是:定时任务只执行了4次。那么怎么解决程序池闲置超时引进Quartz定时任务停止执行问题?

二、解决方案
方案一:设置IIS默认闲置超时为1740(跟程序池默认回收时间1740)
方案二:IIS服务器规定的时间内,定时向服务器取一次数据

三、方案介绍

1)方案一:设置IIS默认闲置超时为1740(跟程序池默认回收时间1740)
  通过设置程序池--高级设置--模型设计--闲置超时,设置为1740(29小时)

原理:改变IIS程序池闲置超时时间,设置为1740(29分钟),保证不会出现闲置超时而执行的资源清理

前提:需保证这个网站一天有一个访问量就不会触发到iis闲置超时而执行的资源清理

2)方案二:IIS服务器规定的时间内,定时向服务器取一次数据

  那就是保持有一台机器开着,在这个Application下写一个文件,用JavaScript每隔几分钟(小于程序池默认闲置超时时间)就自我刷新一下,

浏览器一直开着,这样就强制让它处于被访问的状态。但这个方法并不稳定

原理:强制让它处于被访问的状态,不会出现闲置导致问题

前提:保证浏览器开着,js设置定时方法设置为小于闲置超时时间

PS:

解决方案介绍来自这个网址:http://blog.csdn.net/zhangquanok/article/details/16807603

 

平时多记记,到用时才能看看,记录你的进步,分享你的成果
你可能感兴趣的文章
Siege——多线程编程最佳实例
查看>>
c# 生成 验证码
查看>>
Selenium学习(4) 键盘操作
查看>>
SQL Server 触发器
查看>>
神奇语言 python 初识面向对象
查看>>
何为SLAM
查看>>
Effective C++ 条款五 了解C++默默编写并调用哪些函数
查看>>
图的存储结构(邻接矩阵)
查看>>
[工具]infolite-chrome插件css插件
查看>>
javascript 深拷贝
查看>>
SwitchHosts—hosts管理利器
查看>>
【代码小记】无
查看>>
【知识点】Java机密
查看>>
如何在 Java 中正确使用 wait, notify 和 notifyAll?
查看>>
BarTender 2016表单中的“秤显示”控件
查看>>
仓库盘:动态盘点
查看>>
全面理解javascript的caller,callee,call,apply概念[转载]
查看>>
C#中使用Monitor类、Lock和Mutex类来同步多线程的执行
查看>>
Jquery 下拉框取值
查看>>
POJ 1287 Networking 【最小生成树Kruskal】
查看>>