我的任务是使用一段代码创建一个ASP.NET应用程序,该代码将每半小时自动运行一次。此代码必须每半小时向文件追加一条记录。它不应该取决于用户的请求(无论是否发生) 1)我在Global.asax文件的Application.Start方法中编写代码。我是对的吗? 2)我是否与托管(IIS)设置有关(例如,更改写入文件的权限等)?
我已经尝试过将代码写入文件到Application.Start方法的循环中,然后将项目目录复制到服务器。但是,它没有用。
答案 0 :(得分: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 :(得分:3)
这将是在ASP.Net应用程序中执行此操作的地方(有关如何执行此操作的更多详细信息,请参阅Pauls帖子),但是以这种方式运行任务有许多缺点,其中最重要的是您的任务只会在您的应用程序执行时(即第一个用户访问您的站点时)开始运行 - 如果ASP.net工作进程停止并且没有重新启动您的应用程序,那么您的“后台任务”也将停止
这可能是可以接受的,但如果不是,那么我的方法是将其作为Windows服务写入,或者作为单独的可执行文件,每半小时由一个计划任务运行。
有关如何使用C#创建简单Windows服务的示例,请参阅此链接:
答案 2 :(得分:1)
不,这样的代码不会出现在Application_Start方法中。应用程序首次运行或重置时调用该方法,与“每半小时”无关。
处理此问题的最佳方法是BY FAR,即在同一台计算机上或另一台可以访问“文件”的计算机上创建一个单独的应用程序(无论这意味着什么)。 ASP.NET没有为计时器事件设置,任何在ASP.NET中执行此操作的尝试都可能会影响您网站的性能。
答案 3 :(得分:1)
如果您被迫使用ASP.NET,我建议使用here找到的技术,它使用缓存过期来保持ASP.NET运行并在计时器上触发事件。但是,如果您的应用程序死亡,那么在您启动应用程序之前,计时器将不会重启,直到请求页面为止。
真的没办法,所以如果你需要可靠的东西,你需要以不同的方式做到这一点,可能是使用Windows服务。