怎么在Global.asax文件中定义一个全局唯一的 Timer对象?
我想在其它地方改变这个对象,使其可以定时启动,也可以关闭.

解决方案 »

  1.   

    用全局变量 ApplicationTimer 周期工作开始的时候检测Application是否要求它停止。
      

  2.   

    if(Application["Timer"]==null)//如果不存在就设置
    {
    Timer timer;//这里实例化。
    Application["Timer"]=timer;
    }
    else
    {
    Timer timer=(Timer)Application["Timer"];//这里取
    }
    参考一下。
      

  3.   

    你无需把全局的东西看作“在Global.asax”这么狭隘,这样看会影响你开发许多东西。在一些“范例”中作者写东西在Global.asax只是为了简单说明一个例子而已,而并不是教你设计程序。设计程序时,如果是稍微复杂一点的东西,往往要独立出来。你可以添加一个“类”文件,专门负责处理你心目中的这个“Timer对象”所要做的事情。其实重点不是它何时开启、关闭,而是它到底要定时做什么动作。这个类例如:using System;
    using System.Threading;static public class TestTimer
    {    static Timer GlobalTimer = new Timer(new TimerCallback(GlobalTimer_ToDo), null, Timeout.Infinite, Timeout.Infinite);    static void GlobalTimer_ToDo(object obj)
        {
            //todo : 这里做该做的事
        }    static public void Start(long a, long b)
        {
            GlobalTimer.Change(a, b);
        }    static public void Stop()
        {
            GlobalTimer.Change(Timeout.Infinite, Timeout.Infinite);
        }}
    这样,你就可以在Global.asax中启动它,例如:<%@ Application Language="C#" %><script RunAt="server">
        
        void Application_Start(object sender, EventArgs e)
        {
            TestTimer.Start(0, 2000);  
        }
    你可以在任何类中访问这个TestTimer类,直接调用它的Start、Stop方法。
      

  4.   

    但是你要明白,asp.net以及宿主系统iis经常会定期维护,经常会让应用程序重启。这是你在自己的开发机器上难以遇到也往往忽略去测试的,但是放在生产服务器上这是常态。当应用程序重启时,就又变为上面示例中那样每隔2秒执行一次GlobalTimer_ToDo。除非你把“在其它地方改变这个对象”的参数持久记录在磁盘上(数据库系统也是一种磁盘介质),在Application_Start中首先检索磁盘来设置定时器的启动参数。