在ASP.NET中自动执行代码

时间:2011-03-08 04:24:36

标签: c# .net asp.net

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

我已经尝试过将代码写入文件到Application.Start方法的循环中,然后将项目目录复制到服务器。但是,它没有用。

4 个答案:

答案 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服务。