2016-07-18 39 views
3

每天安排一个任务,我有一个ASP.NET MVC应用程序,让用户存储喜欢的视频和照片的媒体。有道在C#.NET Web应用程序

该应用程序还允许用户删除存储在服务器的媒体。要做到这一点我想实现一个“两步”的过程中,第一个(当选择媒体被删除),在该数据库中的媒体项目将得到一个时间戳表明该条目在一段时间内被删除(例如一个月);如果该时间戳在那段时间内未被删除,则应该有一个每天执行的预定方法,并检查媒体条目是否具有足够的时间戳以被删除。

我的问题是关于调度: 我readed,有一些框架,如FluentScheduler或Quartz.NET实现那种工作。由于该应用程序是在IIS中部署的Web应用程序,因此我不敢使用适当的方式,框架或方法来实现它。由于IIS可以在任何时间,因为,预定的方法将执行写入数据库,并在IO文件系统删除数据库条目和物理文件关闭我的应用程序,这对我非常重要,该方法完全执行或不执行所有,以保持数据库与存储在hd的文件保持一致。

我的第一个赌注是FluentScheduler,但我需要知道,如果使用框架一样,是最好的解决方案。

我知道,这样的问题是不是在StackOverflow的欢迎。这不是一个意见问题,我只想阅读解决方案并选择最适合我的要求的解决方案。

这是某种的会是什么,预定的方法内的伪代码:

using(ViewMediaDBUnitOfWork uw = new ViewMediaDBUnitOfWork()) 
     { 
      var today = DateTime.Now.Date; 

      List<Media> mediaToDelete = uw.MediaRepository.Get(m => (m.ToDelete - today).value.Days > 30); 
      mediaToDelete.ForEach(m => 
      { 
       try 
       { 
        //Deletes from DB 
        uw.MediaRepository.Delete(m); 
        //Deletes the file 
        File.Delete(m.Path); 
        //If everything is ok, savechanges 
        uw.MediaRepository.SaveChanges(); 
       } 
       catch(Exception e) 
       { 
        LogManager.GetCurrentClassLogger().Error("Error deleting. " + m.Path, e); 
       }      
      }); 
     } 
+2

我不会在Web应用程序中安排任务。我会创建一个单独的应用程序,由服务器上的任务调度程序执行清理。 – itsme86

+0

你能否扩大你的答案?如何在服务器上实现任务调度程序...或者可以链接到您想要的更多信息。 – MorgoZ

+0

我只是谈论标准的Windows服务器任务调度器:https://technet.microsoft.com/en-us/library/cc748993(v=ws.11).aspx – itsme86

回答

2

如果你打算安排一个任务,至少你要内至少做HostingEnvironment.QueueBackgroundWorkItem的背景。这会将您的工作注册到ASP.NET运行时。虽然有警告。当ASP.NET无论出于何种原因进行回收时,它都会通知后台工作(通过设置CancellationToken),然后等待指定的时间段(我认为是30秒)完成工作。如果后台工作没有在这个时间框架内完成,工作将会消失。 (由于上述原因),您应该避免在ASP.NET应用程序的上下文中调度工作,如果您可以避免这种情况。您可以创建一个使用这些框架的服务来安排应用程序之外的作业/重复性任务。

但是,更强大的选择是使用像Hangfire这样的技术/框架,它与SQL Server,Redis或MSMQ等某种可靠存储结合使用。

迟发型是一个开源框架,帮助您创建,处理 和管理您的后台任务,你不想把 在您的请求处理管道即操作。

0

这听起来像你会过得更好创建一个单独的服务来处理的时间戳记录的删除,而不是试图将其捆绑到您现有的应用程序。

作为一个非常快速的解决方案,创建a Powershell script需要大约10分钟时间,它将运行SQL查询,删除TimeStamp> x日期的数据。

然后您可以每天运行schedule this script。这比希望IIS工作池线程仍然可以运行要可靠得多。

还有其他一些方法,如SSIS,但可能比您需要的更复杂。