2016-07-18 74 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,但可能比您需要的更復雜。