zoukankan      html  css  js  c++  java
  • (转).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

  • 相关阅读:
    CPP Info Memo part3
    在Google搜索结果显示原始链接(转自 月光博客)
    libc 之 locales
    Git 分支管理与本地 repository 创建
    py2exe issue: ImportError: No module named _fontdata_enc_winansi (http://stackoverflow.com/)
    CPP Info Memo (Part 1)
    CPP Info Memo part2
    HOWTO: Increase write speed by 'aligning' FAT32(通过对齐 FAT32 提高U盘访问速度, 转载)
    (转载)Gentoo中文man乱码
    如何选择开源许可证?(转载)
  • 原文地址:https://www.cnblogs.com/dagon007/p/191850.html
Copyright © 2011-2022 走看看