最近需要做一个定时发送邮件的程序,在网上搜找到如下代码
protected void Application_Start(object sender, EventArgs e) { System.Timers.Timer aTimer = new System.Timers.Timer(); aTimer.Elapsed += new ElapsedEventHandler(TimeEvent); // 设置引发时间的时间间隔 此处设置为1秒 aTimer.Interval = 1000; aTimer.Enabled = true; }
private void TimeEvent(object source, ElapsedEventArgs e) { // 得到 hour minute second 如果等于某个值就开始执行 int intHour = e.SignalTime.Hour; int intMinute = e.SignalTime.Minute; int intSecond = e.SignalTime.Second; // 定制时间,在00:00:00 的时候执行 int iHour = 11; int iMinute = 02; int iSecond = 00; // 设置 每天的00:00:00开始执行程序 if (intHour == iHour && intMinute == iMinute && intSecond == iSecond) { //发送邮件程序 } }
我在本机调试的时候没有问题,可放到服务器上并没有在规定的时件收到邮件,写了个日志才发现Application_Start根本没有执行。最后我查了下Application_Start的执行条件才发现之前我理解错了。
Application_Start:第一个访问网站的用户会触发该方法. 通常会在该方法里定义一些系统变量,如聊天室的在线总人数统计,历史访问人数统计的初始化等等均可在这里定义。
换句话来说我只发布了程序,没有去访问网站里的任意一个资源,那么它就不会执行,问题也就在这里。
那么每发布一次程序就要去人工访问网站,显然有点哆嗦,我们可以这样来做
protected void Application_End(object sender, EventArgs e) { // 在应用程序关闭时运行的代码 // 解决应用池回收问题 System.Threading.Thread.Sleep(5000); string strUrl = "网站地址"; System.Net.HttpWebRequest _HttpWebRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(strUrl); System.Net.HttpWebResponse _HttpWebResponse = (System.Net.HttpWebResponse)_HttpWebRequest.GetResponse(); System.IO.Stream _Stream = _HttpWebResponse.GetResponseStream();//得到回写的字节流 }
这样就搞定了。