.net网站的定时执行某任务

时间:2021-05-10 07:59:21
我用的是vs2005,net2.0版本,C#,其实网上很多这方面的文章,不过我在实践中就发现了问题,首先是Global.asax页面Application_Start的启动一个定时器(不是IIS启动了就可以,要访问网站某页面才能启动)这没什么难的,启动OK我把网站页面关闭了,但是定时就20分钟就失效了,网上文章说是默认的session时间,然后其实我改了<sessionState mode="InProc" timeout="60"/>,它也是只运行了20分钟。网上有人说是IIS应用池的问题,这个我还没有去研究,不过,我想要的是永久的定时执行我的代码,不想他只有session的时间,要怎么做?下面是我的Global.asax的页面。

其实我还遇到一个很奇怪的例子,我一同事和我的代码一样,他的网站就能自己好好的一直定时执行,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建立一个作业

#3


牵扯到定时短信啊,电邮啊这些,在数据库不好弄啊...

#4


如果对数据库操作,还是添加job吧

#5


这类的任务最好另外写程序来跑!

#6


我也想做个这个东西,学习下。

#7


任务计划,数据库作业,线程(不用)

#8


教你一个办法,您可以尝试下!就是在把需要的功能单独做一个exe,然后再服务器任务计划里添加这个任务就可以定时跑程序了!

#9


我晕。。。

#10


权限有限啊,既不合适用sql server的作业,又不可能在服务器端弄个exe或计划任务,用纯网站的方法就不行吗?

#11


你的这个代码不可能可以持续运行的。

网站访问量低的话,遇到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空闲前重新接受一次请求。

#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如何。

#20


引用 2 楼 nosuchtracter 的回复:
利用winidows服务吧
如果是对数据操作的话,可以在sqlserver建立一个作业


支持

#21


路过 学习中!

#22


引用 2 楼 nosuchtracter 的回复:
利用winidows服务吧
如果是对数据操作的话,可以在sqlserver建立一个作业

赞成这个。

#23


谢谢各位,马上结贴

#24


这个可以用了吗?

#1


补充一下,因为有些网站一直有人访问,所以Application_Start 就会频繁的启动,定时就完全没有问题,但是如果是一个没人访问的网站,就会发现只有20分钟有效

#2


利用winidows服务吧
如果是对数据操作的话,可以在sqlserver建立一个作业

#3


牵扯到定时短信啊,电邮啊这些,在数据库不好弄啊...

#4


如果对数据库操作,还是添加job吧

#5


这类的任务最好另外写程序来跑!

#6


我也想做个这个东西,学习下。

#7


任务计划,数据库作业,线程(不用)

#8


教你一个办法,您可以尝试下!就是在把需要的功能单独做一个exe,然后再服务器任务计划里添加这个任务就可以定时跑程序了!

#9


我晕。。。

#10


权限有限啊,既不合适用sql server的作业,又不可能在服务器端弄个exe或计划任务,用纯网站的方法就不行吗?

#11


你的这个代码不可能可以持续运行的。

网站访问量低的话,遇到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空闲前重新接受一次请求。

#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如何。

#20


引用 2 楼 nosuchtracter 的回复:
利用winidows服务吧
如果是对数据操作的话,可以在sqlserver建立一个作业


支持

#21


路过 学习中!

#22


引用 2 楼 nosuchtracter 的回复:
利用winidows服务吧
如果是对数据操作的话,可以在sqlserver建立一个作业

赞成这个。

#23


谢谢各位,马上结贴

#24


这个可以用了吗?