(转).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 事件处理程序中写你的“从数据库取数据生成静态页面”的代码。

原文:http://blog.joycode.com/percyboy/archive/2004/08/21/31240.aspx

posted @ 2005-07-13 08:48  沉默天蝎的学习汇集  阅读(543)  评论(0编辑  收藏  举报