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

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

.NET Framework 提供了三种计时器,分别是:

  • System.Timers.Timer
    基于服务器的计时器,位于“工具箱”的“组件”选项卡上;
  • System.Windows.Forms.Timer
    基于 Windows 的标准计时器,位于“工具箱”的“Windows 窗体”选项卡上;
  • System.Threading.Timer
    仅可在编程时使用的线程计时器。

三种计时器各有特色,详见你的 Visual Studio .NET 文档(位置在: Visual Studio .NET - Visual Basic 和 Visual C# .NET - 使用组件编程 - 创建文件系统和 Timer 组件 - 基于服务器的计时器简介)。

我曾经写过一篇: 在 ASP.NET 中使用计时器(Timer
主要列出了在 ASP.NET 应用程序(注意不是 Web Form )中使用 System.Timers.Timer 的一个示例。

有网友把这个例子写进了 Web Form,试验失败后来我的 blog “发泄”怨气,我是可以理解的,但如某些人那样态度过于“蛮横”也让人难以接受。

Web 页面本来就和 Windows 程序不同的思路,Web 页面大多时候更像 C/S 结构的“请求”-“应答”模型(实际上也是这样)。这样“请求”和“应答”就要讲究效率:不能说你“请求”完了,服务器先“休息”1 分钟,然后在“应答”你;如是是这样,还有网友去你的站点吗?

虽然微软花了不少功夫让 Web Form “看起来”很像 Windows Form,但改变不了 Web 页面的实质,所以在 Web Form 中放置计时器的想法是幼稚的。

其实我能理解,几位网友的实际需求是:让网页定时刷新,或者定时做什么事情。可请你注意,这里的“定时”是发生在哪里的?是服务器端吗?不是吧,是在用户客户端,是在访问你页面的用户浏览器端的“定时”!

ASP.NET 程序中 C#/VB.NET 代码书写的代码都是在服务器端执行的。那么 .NET Framework 提供的三种计时器都不能满足你这样的需求!客户端的“定时”如何要用服务端的“Timer”呢?

客户端的“定时”就要用客户端手段去解决,HTML DOM 模型中的 window 对象有 setTimeout 方法,可以帮助你实现你所想要的客户端效果。

BTW,再比如说,你想让访问者看到一个警告框,这个动作同样发生在客户端,所以依然是用客户端手段(比如: HTML DOM 中 window 对象的 alert 方法),而不是用 .NET C#/VB.NET 代码中的 MsgBox.Show() (如果这样将会在服务器上显示一个警告框,你难道要警告“管理员”吗?)。

回过头来说那篇文章,虽然在 Web Form 中不能使用定时器,但在 ASP.NET 应用程序中却是可以的。

ASP.NET 站点中的所有页面组成一个 Web 应用程序,这个程序是在服务器端运行的,存储大家熟悉的 Application、Session 等信息。当 Web 应用程序从服务器启动时,会触发 Application_OnStart;应用程序结束(服务器关机、重启)时,会触发 Application_OnEnd;接到新的客户端“请求”,Application_BeginRequest;……这是一个持续的过程。(一般地,这些代码都可以写在 global.asax 的代码文件中)我们可以在这个过程中使用“计时器”。当然使用的应该是基于服务器的计时器,System.Timers.Timer 类型。

像 ymm 和 daniel 等网友提出的需求(定时从数据库中取出数据生成静态网页)可以通过文中的方法来实现:

也在你的 Application_OnStart 中启动计时器,在 Elaspsed 事件处理程序中写你的“从数据库取数据生成静态页面”的代码。

发表于 Saturday, August 21, 2004 1:49 PM

评论

#re: .NET 中的三个 Timer 以及网页中的“Timer好象姚冬的文章中有这篇文章。
8/21/2004 2:21 PM | 开心就好

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

http://blog.joycode.com/yaodong/articles/25845.aspx

姚冬的文章,我没看到。他主要写了 .NET Framework 三种计数器的区别。
我主要是针对网友给我以前一篇文章的误解,而解释 Web Form 中 Timer 的不可行性。
8/21/2004 2:28 PM | 破宝

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

其实说到底就是对WEB模型的一些误解,想当然的把windows程序的一些想法带到了WEB中,于是造成了误会。。。
8/21/2004 4:13 PM | cnlamar

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

客户端可以用js:

setTimeout("fnTime()",1000);
8/22/2004 10:58 AM | 宝玉

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

这么简单的东西都有人误解,,,,我算是服了。。。

最近写东西都不用JS了,呵呵,我的智能手机不支持。
8/23/2004 9:51 AM | TommyWOo

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

MessageBox 可以用在asp.net中。
并在客户端弹出一个窗口作提示。
8/26/2004 7:43 PM | 寒枫天伤

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

我发现一个奇怪的现象,就是我把楼主的代码;用c#来实现时是可以的,但是我改成文件读写后它就死活不执行了,真是郁闷。
8/27/2004 12:50 PM | xuxiaoping

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

to xuxiaoping:
可能是操作文件的权限不够,请检查目录的 NTFS 权限。你可以先把那段读写文件的代码放在 Web Form 里测试;如果读写成功,再放到 global 里作为计时事件。

to 寒枫天伤:
你说的是客户端 HTML DOM(或者通常所说的 Javascript)里的 alert() 吧?
如果你是说服务器代码中 MessageBox,不妨贴个例子?……
8/27/2004 12:59 PM | 破宝

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

创建新的 线程的话,无法读取当前页面的内容吧?所以用这种方法行不通
8/27/2004 1:08 PM | fucrosoft

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

to fucrosoft:

本身代码就写在 global.asax 中,哪来的“当前页面”?

你的真实想法是:“将某个 *.aspx 页面输出的内容保存到静态的 *.html 中”?是这样吗?

如果是这样,当然也是可以实现的,但不是像你想象中的那么简单、直接。
(大致思路是:使用 System.Net 中的类,模拟一个 HttpRequest 到那个 aspx,将得到的 HttpResponse 写入到文件中。 但其实还不如另外的思路:从数据库中直接读数据,然后使用 StringBuilder “拼凑”出和那个 *.aspx 页面效果一致的字符串,直接写入 *.html 文件。这样会比前者运行效率高一些,虽然可能会稍微麻烦些。)

不要整天想着天上会掉馅饼,很多时候偷懒是解决不了问题的。
8/30/2004 9:26 AM | 破宝

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

在普通的aspx网页中加入定时器后,无法在Elaspsed 事件进行网页的重定向
11/7/2004 9:56 PM | Blackhorse

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

to Blackhorse:

我文章里强调了:不能在 Web Forms (也就是你说的 aspx 网页)里用 Timer
11/8/2004 9:15 AM | 破宝

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

我要写一个聊天页面放在服务器,客户端访问这个页面时大体上实现两个功能:
显示聊天内容和发送聊天话语,其中聊天内容是从服务器的数据库读取来的。
现在的问题是,在客户端打开的页面能定时从服务器读取最新数据,但却不要刷新整个页面
(因为发送那部分不需要,比如在开头添加: ),
怎么实现呢?用 timer能不能实现?这个问题困扰我好久,哪位兄弟能给点意见?
11/15/2004 5:02 PM | slelotus

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

谁能帮助我在asp.net中实现自动提交功能!!用asp.net,不要js
11/22/2004 5:13 PM | sun

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

TO 破宝:
我说的确实是服务端使用:
MessageBox.Show();

如果在asp.net中用,可以在客户端弹出MessageBox,只是,弹出来的窗口不太好看。弹出来的窗口也确实是Windows窗口。

这样例子,网上有的,你自己找找吧。

MessageBox的Show方法有一个签名可以达到此效果。

我说的绝对不是js中的alert
12/13/2004 12:56 PM | 寒枫天伤

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

to 寒枫天伤:
不妨贴个例子?或者给个连接?
否则我是不会相信的。
12/13/2004 1:17 PM | 破宝

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

能帮助我在asp.net中实现自动提交功能!!用asp.net,不要js
12/15/2004 11:41 AM | jbbjcc

#关于.Net中的计数器

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

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

寒枫天伤 说的是不是这个:
http://www.mono-software.com/DesktopDefault.aspx?tabid=244&tabindex=4
12/27/2004 11:07 AM | Lzp

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

to Lzp:

你说的这个的确封装得很好, 用起来可能会像其他控件一样方便。但归根结底,它也是由 javascript + DHTML 实现的,不信的话,你可以看看它生成的 HTML 源代码……当然这个已经可以称作 ASP.NET 服务器控件了,因为几乎所有的服务器控件都是通过封装 javascript + DHTML 实现特定效果而实现的。

如果没有理解错误的话,寒枫天伤 的意思应该是说在 ASP.NET 服务器端代码中直接使用 System.WindowsForms.MessageBox 这个 Windows Form 控件,显示消息框。但我认为这是不可能的,除非他能举出实例或者给出相关资料链接。
12/28/2004 9:31 AM | 破宝

Post Comment

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值