如题,先谢过各位了,刚接触,想在Global.asax做个定时检查的功能,但结果是没反映(里面执行的那段代码是测试的,就是往数据库里增加一个记录),代码如下:<%@ Application Language="C#" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.Net" %>
<%@ Import Namespace="System.Timers" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Threading" %>
<%@ Import Namespace="System.Data.OleDb" %>
<%@ Import Namespace="System.Configuration" %>
<%@ Import Namespace="System.Web" %><script runat="server">
private System.Timers.Timer myTimer;
protected void Application_Start(Object sender, EventArgs e)
        {
          //定义定时器 
          myTimer=new System.Timers.Timer(60000);
          myTimer.Elapsed+=new System.Timers.ElapsedEventHandler(myTimer_Elapsed);
          myTimer.Enabled=true;
          myTimer.AutoReset = true;        }
 
private void myTimer_Elapsed(object source, ElapsedEventArgs e)
        {
         //这里写需要执行的任务
  string TestSMS="test";
string  connstr="Provider=Microsoft.Jet.Oledb.4.0;Data Source="+      Server.MapPath(ConfigurationSettings.AppSettings["DBPath"])+";";
OleDbConnection conn=new OleDbConnection(connstr);
conn.Open();
string sql = String.Format("insert into smscheck(TestSMS) values(@TestSMS)");
OleDbCommand updatecomm=new OleDbCommand(sql,conn);
updatecomm.Parameters.AddWithValue("@TestSMS",TestSMS);
updatecomm.ExecuteNonQuery();
updatecomm.Dispose();    
conn.Close();
conn.Dispose();
        }
 protected void Application_End(Object sender, EventArgs e)
        {
            //下面的代码解决IIS应用程序池自动回收的问题
            Thread.Sleep(1000);
            //这里设置你的web地址,可以随便指向你的任意一个aspx页面甚至不存在的页面,目的是要激发Application_Start
            string url = "http://localhost:82/111.aspx";
            HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
            HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
            Stream receiveStream = myHttpWebResponse.GetResponseStream();//得到回写的字节流
            
        }
</script>

解决方案 »

  1.   

    但如果把执行部分的代码放在开始那个位置就能执行一次,如下:
    <%@ Application Language="C#" %> 
    <%@ Import Namespace="System" %> 
    <%@ Import Namespace="System.Net" %> 
    <%@ Import Namespace="System.Timers" %> 
    <%@ Import Namespace="System.IO" %> 
    <%@ Import Namespace="System.Threading" %> 
    <%@ Import Namespace="System.Data.OleDb" %> 
    <%@ Import Namespace="System.Configuration" %> 
    <%@ Import Namespace="System.Web" %> <script runat="server"> protected void Application_Start(Object sender, EventArgs e) 
            { 
              //定义定时器 
              string TestSMS="test"; 
    string connstr="Provider=Microsoft.Jet.Oledb.4.0;Data Source="+      Server.MapPath(ConfigurationSettings.AppSettings["DBPath"])+";"; 
    OleDbConnection conn=new OleDbConnection(connstr); 
    conn.Open(); 
    string sql = String.Format("insert into smscheck(TestSMS) values(@TestSMS)"); 
    OleDbCommand updatecomm=new OleDbCommand(sql,conn); 
    updatecomm.Parameters.AddWithValue("@TestSMS",TestSMS); 
    updatecomm.ExecuteNonQuery(); 
    updatecomm.Dispose();   
    conn.Close(); 
    conn.Dispose();        } private void myTimer_Elapsed(object source, ElapsedEventArgs e) 
            { 
            //这里写需要执行的任务 
     
            } 
    protected void Application_End(Object sender, EventArgs e) 
            { 
                //下面的代码解决IIS应用程序池自动回收的问题 
                Thread.Sleep(1000); 
                //这里设置你的web地址,可以随便指向你的任意一个aspx页面甚至不存在的页面,目的是要激发Application_Start 
                string url = "http://localhost:82/111.aspx"; 
                HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
                HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); 
                Stream receiveStream = myHttpWebResponse.GetResponseStream();//得到回写的字节流 
                
            } 
    </script>
      

  2.   

    myTimer=new System.Timers.Timer(60000); 
    你这里时间是60000,就是1分钟,要等1分钟才执行。Application_Start是第一次访问时候执行,只要没有停止访问该站点,以后重复访问不再执行。你的Application_Start事件在多用户访问时候myTimer会被反复实例化,最好做判断。
      

  3.   

    谢谢楼上的热心人,没想到这么晚还有人回复啊,本打算睡前试试看有没人回的,谢了啊。你说的等一分钟会执行,我试过反复等很久也没执行插入记录的数据库操作结果。而你说“Application_Start是第一次访问时候执行”,我试过重启机器,结果还是不执行要执行语句;第三个,你所说的要加判断,怎么判断?谢谢
      

  4.   

    在等待过程中,页面不要关闭。同时,在myTimer_Elapsed中下断点,看看有没有进去,如果进去了,就是你数据库操作的问题了。加判断只是为了判断是否重新实例化timer了,可以将timer定义成static的,用if(timer==null)判断
      

  5.   

    应该不是数据库的问题,我把代码放在另一个页面上,用页面装载时去启动它,能实现效果,代码就是:void Page_load(Object obj,EventArgs e)
      { 
              //定义定时器 
              myTimer=new System.Timers.Timer(60000); 
              myTimer.Elapsed+=new System.Timers.ElapsedEventHandler(myTimer_Elapsed); 
              myTimer.Enabled=true; 
              myTimer.AutoReset = true;         } private void myTimer_Elapsed(object source, ElapsedEventArgs e) 
            { 
            //这里写需要执行的任务 
    string TestSMS="test"; 
    string connstr="Provider=Microsoft.Jet.Oledb.4.0;Data Source="+      Server.MapPath(ConfigurationSettings.AppSettings["DBPath"])+";"; 
    OleDbConnection conn=new OleDbConnection(connstr); 
    conn.Open(); 
    string sql = String.Format("insert into smscheck(TestSMS) values(@TestSMS)"); 
    OleDbCommand updatecomm=new OleDbCommand(sql,conn); 
    updatecomm.Parameters.AddWithValue("@TestSMS",TestSMS); 
    updatecomm.ExecuteNonQuery(); 
    updatecomm.Dispose();   
    conn.Close(); 
    conn.Dispose(); 
            }这样就没问题,到底原因出在什么地方?还有,楼上的,Global.asax中的Application_Start不是只会运行一次的吗?怎么会重复实例呢?不明白
      

  6.   

    Global.asax
    这个文件是干嘛的。我的网站怎么没有啊?
      

  7.   

            // 在应用程序启动时运行的代码
            Application["usercount"] = 0;
            
            //定时器设置
            System.Timers.Timer myTimer = new System.Timers.Timer(60000*60*4);//4小时检测一次
            myTimer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);
            myTimer.Interval = 60000 * 60 * 4;//4小时检测一次
            myTimer.Enabled = true;
      

  8.   

    呵呵,.net中有好几个timer。你选的那个,需要执行它的Start()方法地。例如:protected void Application_Start(Object sender, EventArgs e) 
            { 
              //定义定时器 
              myTimer=new System.Timers.Timer(60000); 
              .......
              myTimer.Start(); 
            } private void myTimer_Elapsed(object source, ElapsedEventArgs e) 
            {
            myTimer.Stop(); 
            //这里写需要执行的任务 
             myTimer.Start(); 
            } 
      

  9.   

    谢谢楼上的SP1234,但按你的方法加了START和STOP也是不行,同样是不执行插入数据库记录
      

  10.   

    建议换用
    System.Threading.Timer 试试.查了一下,据说System.Timers.Timer不太好用.
      

  11.   

    用BackgroundWorker+Thread.Sleep(60000)吧, 我的这样可以的......
      

  12.   

    要在Web.Config的<system.web>...</system.web>中设置:sessionState mode="InProc"
    例如:
    <sessionState mode="InProc" timeout="15" cookieless="false"/>
    <!--上句是用户加上的-->Application_End才能有效。
      

  13.   

    谢谢楼上的,现在问题是Application_Start里的TIMER不生效,怎么办?就是把“定义定时器”的代码和“执行数据库插入”的代码放到其它普通页面里都没问题,为什么这里就行了了?
      

  14.   

    在定时器事件中Server.MapPath不可用,因事件在后台工作线程中执行,而Server.MapPath需要用到Page.Request对象
    把数据库的连接串在Application_Start中拼接好以后通过参数传递给定时器事件,或者把Server.MapPath改成HostingEnvironment.MapPath
      

  15.   

    jshi123果然厉害,确实是路径的问题,但我是刚学的,试着用HostingEnvironment,但没成功,jshi123大侠能不能把你说的这二种方法的具体实现代码写出来让我照搬再研究一下呢?
    就是:“把数据库的连接串在Application_Start中拼接好以后通过参数传递给定时器事件,或者把Server.MapPath改成HostingEnvironment.MapPath”不胜感激啊!
      

  16.   

    jshi123有来看过吗?帮帮忙啊,谢谢了
      

  17.   

    定义一个类成员变量connstr:
    private string connstr;在Application_Start中对其赋值:
    connstr = "Provider=Microsoft.Jet.Oledb.4.0;Data Source="+ Server.MapPath(ConfigurationSettings.AppSettings["DBPath"])+";"; 在 myTimer_Elapsed中直接使用它就可以了
      

  18.   

    或者你也可以把Server.MapPath替换成 HostingEnvironment.MapPath
    注意,如果用这种方法,你的DBPath里必须写绝对路径,就是说必须用毛毛虫开头的"~/xxx/xxx.mdb"这种形式
      

  19.   

    jshi123真是厉害,按你说的第一种方法达到目的了,第二种以~/开头的绝对路径的不知哪里错了没搞好,非常感谢,我是自学的,刚接触,你能介绍点资料或书我看看吗?很多东西糊里糊涂的。
      

  20.   

    第二种方法是指web.config中的DBPath这个路径要以~/开头,你检查下web.config文件吧我不擅长给人介绍资料,唯一我能说的就是多看、多练,找资料的话,你可以另外问下csdn上的高手吧