chiname

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

在 ASP.NET 中使用计时器(Timer)

在 ASP.NET 中使用计时器(Timer)

我在实验中发现在 ASP.NET 中可以使用计时器(Timer)完成一些定时动作。这一点可能会对我们的一些 Web 程序有益。

下面首先介绍我测试使用的一个例子:

  1. 首先在 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 Sub

       Sub Fresher(sender As Object, e As ElapsedEventArgs)
           Application.Lock()
           Application("TimeStamp") = DateTime.Now.ToString()
           Application.UnLock()
       End Sub

    </script>


  2. 然后我们简单写一个 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

评论

# 回复: 在 ASP.NET 中使用计时器(Timer)

的确不错的说!
我决定用这个定时给一些不经常更新的博客发垃圾邮件了。:D
闹到你们每天必须更新二十四篇,否则,大刑伺候。
10/24/2003 12:34 AM | 开心就好

# 回复: 在 ASP.NET 中使用计时器(Timer)

好(Y)
10/24/2003 8:28 AM | 重粒子

# 回复: 在 ASP.NET 中使用计时器(Timer)

不错的构思,,收下了。。
谢谢
10/24/2003 4:19 PM | TommyWOo

# 回复: 在 ASP.NET 中使用计时器(Timer)

我按你上面的代码做了,不行。为什么?
4/30/2004 4:45 PM | misng

# 回复: 在 ASP.NET 中使用计时器(Timer)

为什么要刷新test.aspx呢?
4/30/2004 5:16 PM | misng

# 回复: 在 ASP.NET 中使用计时器(Timer)

是啊,我试过了是可以的,但是为什么要刷新页面呢?能不能不刷新自动改变呢
5/29/2004 2:35 AM | bety

# 回复: 在 ASP.NET 中使用计时器(Timer)

老大,弄个不刷新的啊,网页里面我用啊
6/7/2004 12:02 PM | rosone@126.com

# 回复: 在 ASP.NET 中使用计时器(Timer)

afaf
6/29/2004 6:13 PM | faf

# 回复: 在 ASP.NET 中使用计时器(Timer)

如果将Timer写入普通的aspx页面代码中,请求此页面则Timer启动,可当关闭页面后,Timer仍然运行,该如何处理,就是想当关闭页面时,Timer同时销毁。请教高手,如何处理?
6/29/2004 6:17 PM | zzp

# 回复: 在 ASP.NET 中使用计时器(Timer)

#你说的方法还是在不刷新状态下得不到动态的时间串、你搞不成不要在网上乱搞,让别人笑掉牙,有本事用C#代码或Timer组件在静态网页里制出动态的时钟来,搞不出不来以后不要在网上瞎写东西!
7/3/2004 7:00 PM | hat you

# 回复: 在 ASP.NET 中使用计时器(Timer)

我想定时从数据库中取数据生成静态页面,不就需要在一般页面加定时器吗?在一般页面加定时器如果可用的话,还是大有可为的
7/4/2004 11:12 PM | ymm

# re: 在 ASP.NET 中使用计时器(Timer)

怎么才能定时从数据库中取出数据生成静态网页呢?有没有高招,各位大虾!
8/2/2004 11:28 PM | daniel

# re: 在 ASP.NET 中使用计时器(Timer)

关于上面网友的“疑惑”,请参见文章:
http://blog.joycode.com/percyboy/archive/2004/08/21/31240.aspx
8/21/2004 1:51 PM | 破宝

# re: 在 ASP.NET 中使用计时器(Timer)

回 misng 和 bety:

因为计时器代码是在整个应用程序中运行的,本身没有界面,例子中 test.aspx 的目的是为了显示当前 Application("TimeStamp") 的值来验证 计时器代码是否真正起作用了。

只有计时器代码起作用,Application("TimeStamp") 的值才会每隔 5秒自动改变。刷新 test.aspx 就是要看看它是不是每隔 5秒自动改变了这个值。

而 test.aspx 本身对计时器并没有什么作用。
8/21/2004 1:57 PM | 破宝

# re: 在 ASP.NET 中使用计时器(Timer)

说点与技术无关的:有些人太夸张!根本没有理解楼主的原意,就来蛮横地攻击楼主,这样做对楼主很不负责任,对看同一篇帖子的其它网友也很不负责任,其实对他自己也很不负责任。这里说到底是个交流的地方,应该允许大家偶尔说错话的嘛,何况楼主说得根本就没有错。我说吃冰可以解渴,你却一定说没有办法填饱肚子,我们怎么交流啊?
8/23/2004 1:27 PM | John.J.Dengba

# re: 在 ASP.NET 中使用计时器(Timer)

我觉得在客户端搞东西还是javascript比较方便。。。
8/27/2004 2:05 PM | fucrosoft

# re: 能在 ASP 中实现计时器(Timer)吗?

因为程序是ASP写的,所以要在ASP中更新session和application
8/31/2004 9:26 AM | huisir

# re: 在 ASP.NET 中使用计时器(Timer)

to huisir:

就常用的 ASP 组件来说,还没有办法实现。
我很久不用 ASP 了,不知道是否有第三方组件可以实现这样的功能。
8/31/2004 9:43 AM | 破宝

# re: 在 ASP.NET 中使用计时器(Timer)

fd fd fe fd eeee
11/4/2004 9:19 AM | sd

# re: 在 ASP.NET 中使用计时器(Timer)

我要实现自动提交试卷,怎么办??那个帮我在asp.net中实现啊!!
11/22/2004 5:11 PM | sun

# re: 在 ASP.NET 中使用计时器(Timer)

我想把它 aTimer 停下来怎么办呀??
12/14/2004 6:09 PM | jyk

# re: 在 ASP.NET 中使用计时器(Timer)

我一直在找这个东西。
哈哈,受益匪浅阿,谢谢楼主了。
允许我转载一下吧:)
12/20/2004 5:42 PM | Leisang

# 关于.Net中的计数器

Ping Back来自:blog.csdn.net
12/20/2004 5:46 PM | leisang

# re: 在 ASP.NET 中使用计时器(Timer)

要是是虚拟空间 ,怎么办了?
1/5/2005 12:01 PM | 中美网络

# re: 在 ASP.NET 中使用计时器(Timer)

诸位:
   有谁能告诉我为什么要刷新网页?对网站有什么好处吗?我指的是在网站宣传方面?
谢谢!
1/18/2005 5:10 PM | ap2008

# .NET 中的三个 Timer 以及网页中的“Timer”

Ping Back来自:blog.csdn.net
1/24/2005 11:39 AM | xuhu

# re: 在 ASP.NET 中使用计时器(Timer)

好东西,感激涕零!
作用大大
3/5/2005 11:27 PM | 天才

# re: 在 ASP.NET 中使用计时器(Timer)

这个在网页中加入时间设置,好像不太好做吧.我请问过高人.他们都说用脚本语言才好做.如果是用ASP语言来做的话,就不太现实.而且要让时间不断的变化,那就要不断的更新信息才能获得最新的时间数据.要不断的更新就要不停的刷新页面.这不太可能哈.各位高人有没有其他的什么设想啊.
3/9/2005 7:59 PM | mapels

# re: 在 ASP.NET 中使用计时器(Timer)

HAO
3/12/2005 1:24 PM | caizhiming

# re: 在 ASP.NET 中使用计时器(Timer)

HAOYANGDE
3/12/2005 1:26 PM | caizhiming

# re: 在 ASP.NET 中使用计时器(Timer)

HAO
3/12/2005 1:26 PM | caizhiming

# re: 在 ASP.NET 中使用计时器(Timer)

好教程。^_^
3/24/2005 5:26 PM | CaoCa0

# re: 在 ASP.NET 中使用计时器(Timer)

<HEAD>
<meta http-equiv="refresh" content="20"
url="http://想要刷新的页面.htm">
</Head>
放入这个代码
4/4/2005 9:44 AM | feiying0193

# re: 在 ASP.NET 中使用计时器(Timer)

ygioiyjkl
4/11/2005 2:40 PM | u8uioiy

# re: 在 ASP.NET 中使用计时器(Timer)

意义不是很大。有些定时的工作可能完成不了。会有超时问题。
4/18/2005 12:42 PM | greystar

# 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 | 天涯明月无酒
4/20/2005 3:10 AM | 天涯明月无酒

# re: 在 ASP.NET 中使用计时器(Timer)

有这么个需求:
定时的扫描数据库,并从服务器端将扫描结果发送一封邮件给客户端,提醒客户端.要求用B/S结构做.
当时,我以为用B/S结构从服务器端向客户端推数据根本是做不到的.
现在发现Asp.net可以在服务器端使用Timer,实际上就是提供了一种服务器端向客户端(这里是Browser端)推送数据的手段.
4/29/2005 11:52 AM | gobeyond2000

# re: 在 ASP.NET 中使用计时器(Timer)

to gobeyond2000:
服务器向客户端推数据,和Timer无关,常用XMLHTTP之类的技术保持一个socket连接,才能实现推送。
但你所说的定时发送邮件,和“服务器向客户端推送数据”也是无关的,发送信件不需要客户端的参与,只是服务器端单方面的动作,使用本文中所说的Timer是可以做到的。
希望不要混淆了概念。好运!
5/2/2005 11:31 AM | 破宝

# 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()

这样可以通过数据的大小看是否是连续运行的
5/16/2005 11:17 PM | nonepassby

# re: 在 ASP.NET 中使用计时器(Timer)

to nonepassby:
计时器没必要是连续运行啊!只要web应用程序运行时,它可以定时触发就足够了。
就像 Windows Forms 程序中的计时器,这一次运行和下一次运行,计时器肯定是不同的。
而至于文中的例子,那只是为了证明,计时器管用,
实际程序中有用吗?
5/17/2005 11:06 AM | 破宝

# 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;
}
}
5/17/2005 3:36 PM | srz

# re: 在 ASP.NET 中使用计时器(Timer)

to srz:
计时器对于 ASP.NET 程序来说,仅在 Web 应用程序级别的代码中有效。
对于初学者来说,就是: Timer 的启动代码必须写在 Global.asax.cs/Global.asax.vb 里面。

前面已经多次强调过:写在 Web Form (*.aspx.cs/*.aspx.vb)中是不起作用的。
5/17/2005 4:38 PM | 破宝

# re: 在 ASP.NET 中使用计时器(Timer)

我在global.asax.as 页面在Application.Lock()
Application("TimeStamp") = DateTime.Now.ToString()
Application.UnLock() 这个之后加了一个插入数据库的操作添加一条记录,可是在运行的时候,这些语句没有执行,这个是为什么。我想实现系统经过一个固定时间就想数据库添加以些记录,这个应该怎么做?
5/18/2005 9:03 PM | bksa

# re: 破宝请教一下!

当计时器不停刷新的时候,整个页面都在刷,如果图片多的话很影响速度的,请问能不能只让时钟刷新,做得好象一个倒计时器一样,也是向用来做考试系统的,请求帮助!
5/23/2005 12:48 PM | cuzua

# re: 在 ASP.NET 中使用计时器(Timer)

能不能在asp文件中插入asp.net文件?
5/25/2005 2:17 PM | w

# re: 在 ASP.NET 中使用计时器(Timer)

思路很新颖。跟我最近的想法一样。我想在web中使用事件、委托、线程等。我希望大家的思维要跳过asp带来的影响,多些新的尝试。
6/15/2005 3:27 PM | 千山一鸟

# re: 在 ASP.NET 中使用计时器(Timer)

提问,我在环境下插入了一个timer控件,设置了enable和interval,事件是一个label的值变化,可没效果,是不是一定要你那样在global.asax中设置啊
6/17/2005 6:49 PM | bluekylin

# re: 在 ASP.NET 中使用计时器(Timer)

楼主在global.asax中定义,只是为了防止重复定义timer,放在application_onstart中只是想在web服务启动时启动这个timer而已。我的理解是这样的。
6/21/2005 2:49 PM | luckyprg
posted on 2005-06-22 12:47  把我的欢乐带给你  阅读(5436)  评论(0)    收藏  举报