其实我还遇到一个很奇怪的例子,我一同事和我的代码一样,他的网站就能自己好好的一直定时执行,why?
void Application_Start(object sender, EventArgs e)
{
//在应用程序启动时运行的代码
Application.Lock();
Application["TimerNum"] = "0";
Application.UnLock();
// 启动定时器
System.Timers.Timer t = new System.Timers.Timer();
t.AutoReset = true;
t.Interval = 60000 * 10;//10分钟
t.Elapsed += new ElapsedEventHandler(test);
t.Enabled = true;
}
void test(object sender, EventArgs e)
{
//此处是定时执行的代码
}
24 个解决方案
#1
补充一下,因为有些网站一直有人访问,所以Application_Start 就会频繁的启动,定时就完全没有问题,但是如果是一个没人访问的网站,就会发现只有20分钟有效
#2
利用winidows服务吧
如果是对数据操作的话,可以在sqlserver建立一个作业
如果是对数据操作的话,可以在sqlserver建立一个作业
#3
牵扯到定时短信啊,电邮啊这些,在数据库不好弄啊...
#4
如果对数据库操作,还是添加job吧
#5
这类的任务最好另外写程序来跑!
#6
我也想做个这个东西,学习下。
#7
任务计划,数据库作业,线程(不用)
#8
教你一个办法,您可以尝试下!就是在把需要的功能单独做一个exe,然后再服务器任务计划里添加这个任务就可以定时跑程序了!
#9
我晕。。。
#10
权限有限啊,既不合适用sql server的作业,又不可能在服务器端弄个exe或计划任务,用纯网站的方法就不行吗?
#11
你的这个代码不可能可以持续运行的。
网站访问量低的话,遇到20分钟没有人访问,那么IIS就会回收应用程序池了。它就死翘翘了。
网站访问量低的话,遇到20分钟没有人访问,那么IIS就会回收应用程序池了。它就死翘翘了。
#12
所以才问解决方案嘛
#13
你写在Application_Start,不是Session_Start里
改web.config里的SessionTimeOut对Application不会起作用的,SessionTimeOut只影响Session_End里的代码
可是如果你的网站访问量太小 满足了IIS 应用程序池-性能-在空闲此事件后关闭工作进程 的默认值(20分钟)的话你的Application变量就都被回收了。
方法最简单的就是修改你的 IIS 应用程序池-性能-在空闲此事件后关闭工作进程 改长一些。不过如果1740分钟没有人访问也会挂掉。
另一个办法不知道是否可行,在你的test()任务里定期建立一个WebClient或HttpWebRequest请求你自己的网站,这周期小于20分钟,呵呵!在IIS空闲前重新接受一次请求。
改web.config里的SessionTimeOut对Application不会起作用的,SessionTimeOut只影响Session_End里的代码
可是如果你的网站访问量太小 满足了IIS 应用程序池-性能-在空闲此事件后关闭工作进程 的默认值(20分钟)的话你的Application变量就都被回收了。
方法最简单的就是修改你的 IIS 应用程序池-性能-在空闲此事件后关闭工作进程 改长一些。不过如果1740分钟没有人访问也会挂掉。
另一个办法不知道是否可行,在你的test()任务里定期建立一个WebClient或HttpWebRequest请求你自己的网站,这周期小于20分钟,呵呵!在IIS空闲前重新接受一次请求。
#14
我记得Application_Start只在第一个人访问网站时运行,对吗?
#15
关注 我的做成服务了
#16
学习。。。。
#17
protected void Application_End(object sender, EventArgs e)
{
//在应用程序关闭时运行的代码
//下面的代码是关键,可解决IIS应用程序池自动回收的问题
Thread.Sleep(1000);
//这里设置你的web地址,可以随便指向你的任意一个aspx页面甚至不存在的页面,目的是要激发Application_Start
string url = "http://www.google.com";
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
System.IO.Stream receiveStream = myHttpWebResponse.GetResponseStream();//得到回写的字节流
}
#18
没有遇到过!
学习中!
学习中!
#19
17楼的方法看似可行,还没测试过,不过 Thread.Sleep(1000);
1000ms是不是有点短,设置为5分钟 1000*60*5如何。
1000ms是不是有点短,设置为5分钟 1000*60*5如何。
#20
支持
#21
路过 学习中!
#22
赞成这个。
#23
谢谢各位,马上结贴
#24
这个可以用了吗?
#1
补充一下,因为有些网站一直有人访问,所以Application_Start 就会频繁的启动,定时就完全没有问题,但是如果是一个没人访问的网站,就会发现只有20分钟有效
#2
利用winidows服务吧
如果是对数据操作的话,可以在sqlserver建立一个作业
如果是对数据操作的话,可以在sqlserver建立一个作业
#3
牵扯到定时短信啊,电邮啊这些,在数据库不好弄啊...
#4
如果对数据库操作,还是添加job吧
#5
这类的任务最好另外写程序来跑!
#6
我也想做个这个东西,学习下。
#7
任务计划,数据库作业,线程(不用)
#8
教你一个办法,您可以尝试下!就是在把需要的功能单独做一个exe,然后再服务器任务计划里添加这个任务就可以定时跑程序了!
#9
我晕。。。
#10
权限有限啊,既不合适用sql server的作业,又不可能在服务器端弄个exe或计划任务,用纯网站的方法就不行吗?
#11
你的这个代码不可能可以持续运行的。
网站访问量低的话,遇到20分钟没有人访问,那么IIS就会回收应用程序池了。它就死翘翘了。
网站访问量低的话,遇到20分钟没有人访问,那么IIS就会回收应用程序池了。它就死翘翘了。
#12
所以才问解决方案嘛
#13
你写在Application_Start,不是Session_Start里
改web.config里的SessionTimeOut对Application不会起作用的,SessionTimeOut只影响Session_End里的代码
可是如果你的网站访问量太小 满足了IIS 应用程序池-性能-在空闲此事件后关闭工作进程 的默认值(20分钟)的话你的Application变量就都被回收了。
方法最简单的就是修改你的 IIS 应用程序池-性能-在空闲此事件后关闭工作进程 改长一些。不过如果1740分钟没有人访问也会挂掉。
另一个办法不知道是否可行,在你的test()任务里定期建立一个WebClient或HttpWebRequest请求你自己的网站,这周期小于20分钟,呵呵!在IIS空闲前重新接受一次请求。
改web.config里的SessionTimeOut对Application不会起作用的,SessionTimeOut只影响Session_End里的代码
可是如果你的网站访问量太小 满足了IIS 应用程序池-性能-在空闲此事件后关闭工作进程 的默认值(20分钟)的话你的Application变量就都被回收了。
方法最简单的就是修改你的 IIS 应用程序池-性能-在空闲此事件后关闭工作进程 改长一些。不过如果1740分钟没有人访问也会挂掉。
另一个办法不知道是否可行,在你的test()任务里定期建立一个WebClient或HttpWebRequest请求你自己的网站,这周期小于20分钟,呵呵!在IIS空闲前重新接受一次请求。
#14
我记得Application_Start只在第一个人访问网站时运行,对吗?
#15
关注 我的做成服务了
#16
学习。。。。
#17
protected void Application_End(object sender, EventArgs e)
{
//在应用程序关闭时运行的代码
//下面的代码是关键,可解决IIS应用程序池自动回收的问题
Thread.Sleep(1000);
//这里设置你的web地址,可以随便指向你的任意一个aspx页面甚至不存在的页面,目的是要激发Application_Start
string url = "http://www.google.com";
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
System.IO.Stream receiveStream = myHttpWebResponse.GetResponseStream();//得到回写的字节流
}
#18
没有遇到过!
学习中!
学习中!
#19
17楼的方法看似可行,还没测试过,不过 Thread.Sleep(1000);
1000ms是不是有点短,设置为5分钟 1000*60*5如何。
1000ms是不是有点短,设置为5分钟 1000*60*5如何。
#20
支持
#21
路过 学习中!
#22
赞成这个。
#23
谢谢各位,马上结贴
#24
这个可以用了吗?