在 ASP.NET 中使用计时器(Timer)
在 ASP.NET 中使用计时器(Timer)
我在实验中发现在 ASP.NET 中可以使用计时器(Timer)完成一些定时动作。这一点可能会对我们的一些 Web 程序有益。
下面首先介绍我测试使用的一个例子:
- 首先在 global.asax 中的 Application_OnStart 事件过程中定义计时器,代码如下:
[VB.NET] global.asax
<%@ import Namespace="System.Timers" %>
<script runat="server">Sub Application_OnStart(sender As Object, e As EventArgs)
' 创建一个计时器,单位:毫秒
Dim aTimer As New System.Timers.Timer(10000)' 将 Fresher 指定为计时器的 Elapsed 事件处理程序
AddHandler aTimer.Elapsed, AddressOf Fresher' AutoReset 属性为 true 时,每隔指定时间循环一次;
' 如果为 false,则只执行一次。
aTimer.AutoReset = True
aTimer.Enabled = True
' 先给 Application("TimeStamp") 指定一个初值
Application.Lock()
Application("TimeStamp") = DateTime.Now.ToString()
Application.UnLock()
End SubSub Fresher(sender As Object, e As ElapsedEventArgs)
Application.Lock()
Application("TimeStamp") = DateTime.Now.ToString()
Application.UnLock()
End Sub</script>
- 然后我们简单写一个 test.aspx 来查看 Application("TimeStamp") 的值。代码如下:
[VB.NET] test.aspx
<%
Response.Write(Application("TimeStamp"))
%>
分析:
根据 global.asax 中的代码,我们设定了一个计时器,每隔 10 秒钟执行一次 Fresher() 过程;在 Fresher() 过程中我们事实上只是重新写入了一个 Application("TimeStamp") 新值。换句话说,Application("TimeStamp") 的值是应该每隔 10 秒钟更新一次的。
是不是这样的呢?通过 test.aspx 的反复刷新观察 Application("TimeStamp") 的值,的确发现这个值在每隔 10 秒地变化一次,而其他时候则保持不变。与我们的预期是一致的。
意义:
通过引入计时器我们可以在 ASP.NET 的全局性程序(Application)中灵活的使用计时器完成一些定时操作,比如:在社区/论坛系统中,每隔 5 分钟更新一次在线用户列表,每隔 1 个小时更新一次用户经验值,或者每隔一天备份一次关键数据等等。这个思路应该是很诱人的。
探讨:
Q: 是否在 ASP.NET 代码的任何地方都可以使用计时器呢?
A: 我没有测试过在普通 *.aspx 中插入计时器的情形。但从 B/S 程序的特点来看,即使在 *.aspx 中插入计时器可行,也不是一种好的选择。因为对于 B/S 程序来说,服务器接到客户端的请求本身就是一个事件,在这个事件处理过程中,服务器必须迅速的作出回应,为客户端产生相应的 HTML 代码,然后结束这一过程。如果在 *.aspx 使用计时器(如果允许的话),则第一没有太大必要,第二很容易使系统因为插入的计时器过多(因为每一次 *.aspx 的执行都有可能插入一个新的计时器)而使系统瘫痪。
因此,我建议只在 global.asax 的 Application_OnStart 中使用比较安全一些。欢迎对此感兴趣的朋友对此发表见解。
(转载请注明出处)
发表于 Thursday, October 23, 2003 8:06 PM

浙公网安备 33010602011771号
评论
# 回复: 在 ASP.NET 中使用计时器(Timer)
的确不错的说!我决定用这个定时给一些不经常更新的博客发垃圾邮件了。:D
闹到你们每天必须更新二十四篇,否则,大刑伺候。
# 回复: 在 ASP.NET 中使用计时器(Timer)
好(Y)# 回复: 在 ASP.NET 中使用计时器(Timer)
不错的构思,,收下了。。谢谢
# 回复: 在 ASP.NET 中使用计时器(Timer)
我按你上面的代码做了,不行。为什么?# 回复: 在 ASP.NET 中使用计时器(Timer)
为什么要刷新test.aspx呢?# 回复: 在 ASP.NET 中使用计时器(Timer)
是啊,我试过了是可以的,但是为什么要刷新页面呢?能不能不刷新自动改变呢# 回复: 在 ASP.NET 中使用计时器(Timer)
老大,弄个不刷新的啊,网页里面我用啊# 回复: 在 ASP.NET 中使用计时器(Timer)
afaf# 回复: 在 ASP.NET 中使用计时器(Timer)
如果将Timer写入普通的aspx页面代码中,请求此页面则Timer启动,可当关闭页面后,Timer仍然运行,该如何处理,就是想当关闭页面时,Timer同时销毁。请教高手,如何处理?# 回复: 在 ASP.NET 中使用计时器(Timer)
#你说的方法还是在不刷新状态下得不到动态的时间串、你搞不成不要在网上乱搞,让别人笑掉牙,有本事用C#代码或Timer组件在静态网页里制出动态的时钟来,搞不出不来以后不要在网上瞎写东西!# 回复: 在 ASP.NET 中使用计时器(Timer)
我想定时从数据库中取数据生成静态页面,不就需要在一般页面加定时器吗?在一般页面加定时器如果可用的话,还是大有可为的# re: 在 ASP.NET 中使用计时器(Timer)
怎么才能定时从数据库中取出数据生成静态网页呢?有没有高招,各位大虾!# re: 在 ASP.NET 中使用计时器(Timer)
关于上面网友的“疑惑”,请参见文章:http://blog.joycode.com/percyboy/archive/2004/08/21/31240.aspx
# re: 在 ASP.NET 中使用计时器(Timer)
回 misng 和 bety:因为计时器代码是在整个应用程序中运行的,本身没有界面,例子中 test.aspx 的目的是为了显示当前 Application("TimeStamp") 的值来验证 计时器代码是否真正起作用了。
只有计时器代码起作用,Application("TimeStamp") 的值才会每隔 5秒自动改变。刷新 test.aspx 就是要看看它是不是每隔 5秒自动改变了这个值。
而 test.aspx 本身对计时器并没有什么作用。
# re: 在 ASP.NET 中使用计时器(Timer)
说点与技术无关的:有些人太夸张!根本没有理解楼主的原意,就来蛮横地攻击楼主,这样做对楼主很不负责任,对看同一篇帖子的其它网友也很不负责任,其实对他自己也很不负责任。这里说到底是个交流的地方,应该允许大家偶尔说错话的嘛,何况楼主说得根本就没有错。我说吃冰可以解渴,你却一定说没有办法填饱肚子,我们怎么交流啊?# re: 在 ASP.NET 中使用计时器(Timer)
我觉得在客户端搞东西还是javascript比较方便。。。# re: 能在 ASP 中实现计时器(Timer)吗?
因为程序是ASP写的,所以要在ASP中更新session和application# re: 在 ASP.NET 中使用计时器(Timer)
to huisir:就常用的 ASP 组件来说,还没有办法实现。
我很久不用 ASP 了,不知道是否有第三方组件可以实现这样的功能。
# re: 在 ASP.NET 中使用计时器(Timer)
fd fd fe fd eeee# re: 在 ASP.NET 中使用计时器(Timer)
我要实现自动提交试卷,怎么办??那个帮我在asp.net中实现啊!!# re: 在 ASP.NET 中使用计时器(Timer)
我想把它 aTimer 停下来怎么办呀??# re: 在 ASP.NET 中使用计时器(Timer)
我一直在找这个东西。哈哈,受益匪浅阿,谢谢楼主了。
允许我转载一下吧:)
# 关于.Net中的计数器
Ping Back来自:blog.csdn.net# re: 在 ASP.NET 中使用计时器(Timer)
要是是虚拟空间 ,怎么办了?# re: 在 ASP.NET 中使用计时器(Timer)
诸位:有谁能告诉我为什么要刷新网页?对网站有什么好处吗?我指的是在网站宣传方面?
谢谢!
# .NET 中的三个 Timer 以及网页中的“Timer”
Ping Back来自:blog.csdn.net# re: 在 ASP.NET 中使用计时器(Timer)
好东西,感激涕零!作用大大
# re: 在 ASP.NET 中使用计时器(Timer)
这个在网页中加入时间设置,好像不太好做吧.我请问过高人.他们都说用脚本语言才好做.如果是用ASP语言来做的话,就不太现实.而且要让时间不断的变化,那就要不断的更新信息才能获得最新的时间数据.要不断的更新就要不停的刷新页面.这不太可能哈.各位高人有没有其他的什么设想啊.# re: 在 ASP.NET 中使用计时器(Timer)
HAO# re: 在 ASP.NET 中使用计时器(Timer)
HAOYANGDE# re: 在 ASP.NET 中使用计时器(Timer)
HAO# re: 在 ASP.NET 中使用计时器(Timer)
好教程。^_^# re: 在 ASP.NET 中使用计时器(Timer)
<HEAD><meta http-equiv="refresh" content="20"
url="http://想要刷新的页面.htm">
</Head>
放入这个代码
# re: 在 ASP.NET 中使用计时器(Timer)
ygioiyjkl# re: 在 ASP.NET 中使用计时器(Timer)
意义不是很大。有些定时的工作可能完成不了。会有超时问题。# re: 在 ASP.NET 中使用计时器(Timer)
re: .NET 中的三个 Timer 以及网页中的“Timer”我正再写个网站,里面有个这样的页面(当然,还没有实现)
有8张图片分别装在8个IMAGE里,排列是这样的***
* *
***
我现在的构思是,先随机找到一个图片把它更换成另外的图片,然后按照顺时针方向逐一进行更换,当后一副图片更换,前一副图片就恢复原来的样子,每两张图片之间的时间间隔是0.2秒,用BUTTON启动,让这个过程在3-5秒的随机时间里终止,并显示最后一张图片,
现在请教各位大虾,这个过程用什么方法实现,效率比较高,
高手请回复!!!谢谢!!!
4/20/2005 3:04 AM | 天涯明月无酒
# re: .NET 中的三个 Timer 以及网页中的“Timer”
晕,排列是这样的***
* *
***
如果有其他的方法实现这个效果也可以的!谢谢!!!
4/20/2005 3:06 AM | 天涯明月无酒
# re: .NET 中的三个 Timer 以及网页中的“Timer”
倒,你这个网站看来有点BUG,
排列是这样的 ***
--------------- * *
--------------- ***
现在总该不会错吧@-@
4/20/2005 3:08 AM | 天涯明月无酒
# re: 在 ASP.NET 中使用计时器(Timer)
有这么个需求:定时的扫描数据库,并从服务器端将扫描结果发送一封邮件给客户端,提醒客户端.要求用B/S结构做.
当时,我以为用B/S结构从服务器端向客户端推数据根本是做不到的.
现在发现Asp.net可以在服务器端使用Timer,实际上就是提供了一种服务器端向客户端(这里是Browser端)推送数据的手段.
# re: 在 ASP.NET 中使用计时器(Timer)
to gobeyond2000:服务器向客户端推数据,和Timer无关,常用XMLHTTP之类的技术保持一个socket连接,才能实现推送。
但你所说的定时发送邮件,和“服务器向客户端推送数据”也是无关的,发送信件不需要客户端的参与,只是服务器端单方面的动作,使用本文中所说的Timer是可以做到的。
希望不要混淆了概念。好运!
# re: 在 ASP.NET 中使用计时器(Timer)
楼主:我觉得这种方案应当不是很合理,我提出点疑问,没有经过验证,楼主可以测试一下
因为在所有的会话结束后,Application也会结束,应用程序结束时,定时器应当也会被销毁.
本测试页之所以看起来好象是对的,是因为在Application运行期间,定时器一直有效,而在Application停止后再次启动时,时钟又会再次启动,而你的测试要素是DateTime.Now,看起来好象是最新的,一直在运行一样.实际上可能已不是连续运行的那个定时器了.
楼主可以把测试数据改为
Application.Lock()
Application["Counter"] = 0;
Application.UnLock()
Application.Lock()
Application["Counter"] = Convert.ToInt32(Application["Counter"]) + 1;
Application.UnLock()
这样可以通过数据的大小看是否是连续运行的
# re: 在 ASP.NET 中使用计时器(Timer)
to nonepassby:计时器没必要是连续运行啊!只要web应用程序运行时,它可以定时触发就足够了。
就像 Windows Forms 程序中的计时器,这一次运行和下一次运行,计时器肯定是不同的。
而至于文中的例子,那只是为了证明,计时器管用,
实际程序中有用吗?
# re: 在 ASP.NET 中使用计时器(Timer)
楼住的代码是没有问题的,这种方式确实很好用现在我有个问题,当把
Sub Fresher(sender As Object, e As ElapsedEventArgs)
Application.Lock()
Application("TimeStamp") = DateTime.Now.ToString()
Application.UnLock()
End Sub
这端代码中的
Application.Lock()
Application("TimeStamp") = DateTime.Now.ToString()
Application.UnLock()
这个事件放在其它的类中时,这个事件不会被触发,楼主试一下看有这种现象没?比如
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
test t = new test();
t.ADD();
}
public class test
{
public void ADD()
{
System.Web.HttpContext.Current.Application["TimeStamp"] = (int)System.Web.HttpContext.Current.Application["TimeStamp"] + 1;
}
}
# re: 在 ASP.NET 中使用计时器(Timer)
to srz:计时器对于 ASP.NET 程序来说,仅在 Web 应用程序级别的代码中有效。
对于初学者来说,就是: Timer 的启动代码必须写在 Global.asax.cs/Global.asax.vb 里面。
前面已经多次强调过:写在 Web Form (*.aspx.cs/*.aspx.vb)中是不起作用的。
# re: 在 ASP.NET 中使用计时器(Timer)
我在global.asax.as 页面在Application.Lock()Application("TimeStamp") = DateTime.Now.ToString()
Application.UnLock() 这个之后加了一个插入数据库的操作添加一条记录,可是在运行的时候,这些语句没有执行,这个是为什么。我想实现系统经过一个固定时间就想数据库添加以些记录,这个应该怎么做?
# re: 破宝请教一下!
当计时器不停刷新的时候,整个页面都在刷,如果图片多的话很影响速度的,请问能不能只让时钟刷新,做得好象一个倒计时器一样,也是向用来做考试系统的,请求帮助!# re: 在 ASP.NET 中使用计时器(Timer)
能不能在asp文件中插入asp.net文件?# re: 在 ASP.NET 中使用计时器(Timer)
思路很新颖。跟我最近的想法一样。我想在web中使用事件、委托、线程等。我希望大家的思维要跳过asp带来的影响,多些新的尝试。# re: 在 ASP.NET 中使用计时器(Timer)
提问,我在环境下插入了一个timer控件,设置了enable和interval,事件是一个label的值变化,可没效果,是不是一定要你那样在global.asax中设置啊# re: 在 ASP.NET 中使用计时器(Timer)
楼主在global.asax中定义,只是为了防止重复定义timer,放在application_onstart中只是想在web服务启动时启动这个timer而已。我的理解是这样的。