global.asax文件中的application_start方法执行问题

阿蛋111 2011-08-17 09:44:17
我有个事物需要在每天凌成1点执行,我在global文件中的application_start方法中做了个timer,代码如下
protected void Application_Start(object sender, EventArgs e)
{
System.Timers.Timer myTimer = new System.Timers.Timer(180000);

myTimer.Elapsed += new ElapsedEventHandler(myTimer_Elapsed);
myTimer.Enabled = true;//
myTimer.AutoReset = true;

}

void myTimer_Elapsed(object source, ElapsedEventArgs e)
{

log.Info("----程序执行-----");
/*
int hour = e.SignalTime.Hour;
int min = e.SignalTime.Minute;
int sec = e.SignalTime.Second;


int iHour = 17;
int iMin = 10;
int iSec = 0;


if (hour == iHour && min == iMin && sec == iSec)
{
//业务代码在这里
}


}


现在问题是想知道application_start的执行时间。
据我所知,这个方法是在应用程序开始时启动,但是我把web工程部署到IIS上面后没有执行,自己访问了一下页面,也还是没有执行,不解????
另外想知道,如果部署成功,IIS正常运行,web服务也不重启,想请问事物会不会中断。。。
...全文
962 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
chen7991951 2012-08-29
  • 打赏
  • 举报
回复
楼主你好,我现在也需要用到类似的功能,请问你是怎么解决的?

发布后浏览一下网站就可以了吗?

还有,你是怎么定位时间点的?

第一次运行的时候可以计算当前时间到凌晨1点的间隔,那第二次开始怎么判断是否为1点呢?


[Quote=引用楼主 的回复:]
我有个事物需要在每天凌成1点执行,我在global文件中的application_start方法中做了个timer,代码如下
protected void Application_Start(object sender, EventArgs e)
{
System.Timers.Timer myTimer = new System.Timers.T……
[/Quote]
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lidan0902061210 的回复:]
谢执行间隔谢提醒,这个很受用,确实没有考虑到这个细节。

不过我现在主要问题是无法激活application_start
我在测试时并没有指定具体执行时间,timer间隔时间为1000ms,但是还是没用
[/Quote]

你是监视了application_start还是只是监视了你的 myTimer ? 后者应该声明为static的。如果说前者没有执行,可能是网站上一些文件新旧混杂,那么最好清空你的解决方案,清空无关的dll文件,重新发布(重新编译)一次。发布到网站上之后,最好使用一个FTP同步程序把那些本地发布目录里没有但是网站上有的文件全都删除掉(除了app_data目录下的文件)。
孟子E章 2011-08-17
  • 打赏
  • 举报
回复
另外,是否执行你是怎么判断的?也可能你判断方法或者执行的任务代码是错误的。iis环境和开发环境是有本质不同的,不要以为开发环境的代码正确就意味着iis里面也是正确的。你要简化测试方法
孟子E章 2011-08-17
  • 打赏
  • 举报
回复
你重启iis后必须访问下网站,否则是不执行的
阿蛋111 2011-08-17
  • 打赏
  • 举报
回复
谢执行间隔谢提醒,这个很受用,确实没有考虑到这个细节。

不过我现在主要问题是无法激活application_start
我在测试时并没有指定具体执行时间,timer间隔时间为1000ms,但是还是没用


[Quote=引用 8 楼 dalmeeme 的回复:]

你设了计时器每180秒,即3分钟触发一次事件,这是不妥的。因为你后面判断了一个确定的时间17:10:00来执行,3分钟一次判断很难正好踩中精确到秒的这个时刻。应该改为1分钟触发一次,并且去掉17:10:00最后的秒,用17:10判断就行了。

一般不会中断,除非你说的情况发生。
[/Quote]
dalmeeme 2011-08-17
  • 打赏
  • 举报
回复
你设了计时器每180秒,即3分钟触发一次事件,这是不妥的。因为你后面判断了一个确定的时间17:10:00来执行,3分钟一次判断很难正好踩中精确到秒的这个时刻。应该改为1分钟触发一次,并且去掉17:10:00最后的秒,用17:10判断就行了。

一般不会中断,除非你说的情况发生。
孟子E章 2011-08-17
  • 打赏
  • 举报
回复
IIS重启了,你还得访问下页面。.net在没人访问的时候,是不执行的。
另外,注意时间设置
阿蛋111 2011-08-17
  • 打赏
  • 举报
回复
这点我考虑过,主要是用来防止应用程序池回收的情况,可以在application_end里对再次访问下一个页面

但我现在的情况是服务刚部署到IIS,也重启过了也初次访问了系统,但就是看不到application_start里面的执行。所以很奇怪

[Quote=引用 4 楼 net_lover 的回复:]

你应该使用System.Threading.Timer
如果长时间没人访问页面,是会停止的。所以你必须在Timer里面自己访问一个简单的页面

参见
http://blog.csdn.net/net_lover/article/details/6943
[/Quote]
阿蛋111 2011-08-17
  • 打赏
  • 举报
回复
我在做测试的时候,服务部署到IIS,IIS重启了,也访问了系统,但是就是没看到执行,如果单纯在VS中调试,执行是没有问题的。。


[Quote=引用 2 楼 leonbingo 的回复:]

Application_Start是在程序第一次执行的时候执行的,如果你要看到,那么,你将IIS重启,然后访问就可以
[/Quote]
孟子E章 2011-08-17
  • 打赏
  • 举报
回复
你应该使用System.Threading.Timer
如果长时间没人访问页面,是会停止的。所以你必须在Timer里面自己访问一个简单的页面

参见
http://blog.csdn.net/net_lover/article/details/6943
子夜__ 2011-08-17
  • 打赏
  • 举报
回复
现在也不是凌晨1点哇。
你要根据服务器时间来算
leonbingo 2011-08-17
  • 打赏
  • 举报
回复
Application_Start是在程序第一次执行的时候执行的,如果你要看到,那么,你将IIS重启,然后访问就可以
阿蛋111 2011-08-17
  • 打赏
  • 举报
回复
没有人回复么。。。
阿蛋111 2011-08-17
  • 打赏
  • 举报
回复
也非常感谢你的回复,本来是打算另写一个winform应用,依靠windows计划任务来调用,但觉得麻烦。
现在问题已经搞定,具体原因不好说,换了台机器进行编译和调试就搞定了。

[Quote=引用 11 楼 net_lover 的回复:]

另外,是否执行你是怎么判断的?也可能你判断方法或者执行的任务代码是错误的。iis环境和开发环境是有本质不同的,不要以为开发环境的代码正确就意味着iis里面也是正确的。你要简化测试方法
[/Quote]
阿蛋111 2011-08-17
  • 打赏
  • 举报
回复
搞定了,很可能是你说的这个原因,我换了一台机器进行测试,问题得到解决,十分感谢

[Quote=引用 12 楼 sp1234 的回复:]

引用 9 楼 lidan0902061210 的回复:
谢执行间隔谢提醒,这个很受用,确实没有考虑到这个细节。

不过我现在主要问题是无法激活application_start
我在测试时并没有指定具体执行时间,timer间隔时间为1000ms,但是还是没用


你是监视了application_start还是只是监视了你的 myTimer ? 后者应该声明为static的。如果说……
[/Quote]

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧