2011-03-08 116 views
3

我的任务是使用一段代码创建一个ASP.NET应用程序,该代码将每隔半小时自动运行一次。此代码必须每半小时向文件添加一条记录。它不应该取决于用户的请求(无论他们是否发生)。
1)我在Global.asax文件的Application.Start方法中编写我的代码。我对吗?
2)我是否与托管(IIS)设置有关(例如更改写入文件的权限等)?在ASP.NET中自动执行代码

我已经尝试只是把代码写入到文件导入到Application.Start方法的循环,然后刚才复制的项目目录服务器。但是,它没有工作。

回答

1

如果你被迫使用ASP.NET,我会推荐技术发现here,它使用缓存过期来保持ASP.NET在定时器上运行和触发事件。但总有这样的危险,即如果你的应用程序死亡,那么定时器将不会重新启动,直到请求一个页面,启动应用程序。

有真的没有办法解决它,所以如果你需要的东西可靠的,你需要做到这一点不同,可能与Windows服务。

4

你需要产生另一个线程来执行而不依赖于用户。将它放在Application.Start事件的循环中基本上会使应用程序死锁。

void Application_Start(...) 
{ 
    Thread thread = new Thread(CronThread); 
    thread.IsBackground = true; 
    thread.Start(); 
} 

private void CronThread() 
{ 
    while(true) 
    { 
     Thread.Sleep(TimeSpan.FromMinutes(30)); 
     // Do something every half hour 
    } 
} 
+1

我要建议服务或石英,但从来没有完全想到你刚刚张贴的东西,相当新颖的方法,我不知道这是否会真正work..it可能,但非常有创意+1 – kd7 2011-03-08 04:30:20

1

不,这样的代码不会进入您的Application_Start方法。当应用程序第一次运行或重置时与该方法对应,并且与“每半小时”无关。

来处理这种情况的最好办法,到目前为止,是创建一个单独的应用程序,无论是在同一台计算机上或可访问“文件”(知道是什么意思),另一台计算机上。 ASP.NET没有设置定时器事件,并且任何在ASP.NET中执行此操作的尝试都可能会影响网站的性能。

3

这将是一个ASP.Net应用程序做到这一点(见保罗职位上,你会怎么做这个更多细节),但是运行你的任务在这样的地方有很多缺点,并非最不重要的,其中的是你的任务只在你的应用程序执行时才开始运行(即当第一个用户访问你的站点时) - 如果ASP.net工作进程停止并且因任何原因不重新启动你的应用程序,那么你的“后台任务”将停止太。

这是可以接受的,但是如果它不是,那么我的方法是通过计划任务要么写为Windows服务或作为一个独立的可执行文件运行每半小时一班。

请参阅此链接的使用如何创建一个简单的Windows服务C#示例: