2015-08-24 45 views
2

在我的ASP MVC 5應用程序中,我有這個數據庫相關的操作,我必須在一個月內執行一次,大概需要30-60分鐘。 我開始這個動作是這樣的:ASP MVC應用程序重置長時間運行的線程

Repository dbForCategories = new Repository(); 
     dbForCategories.Database.CommandTimeout = 60000; 
var t = Task.Factory.StartNew(async delegate 
     { 
      var crs = new ProductCategoryRelationsSetter(dbForCategories, categoryService); 
      crs.AddProductsCategoriesRelations(oneLineTree); 

     }, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default); 

約5分鐘在後臺進出口工作越來越登出應用後。我認爲該應用程序重置,因爲一些靜態變量Im使用重置。 在elmah我沒有任何錯誤。我把我的代碼放在Try Catch塊中。

在你們:)

+5

'「我已經在一個月可能進行一次,大約需要30操作 - 60分」' - 這是*不*爲Web應用程序的任務。這是計劃的控制檯應用程序或Windows服務的任務。 – David

+0

或使用ASP.NET MVC的任務調度程序庫,如https://github.com/jgeurts/FluentScheduler – Luca

回答

5

正如@大衛只提到了希望,它可能是最好的去Windows Service路線:

  • 寫的項目到數據庫表
  • 讓一個Windows Service民意調查表格每個月(或者你經常需要它)。
  • 如果在隊列中找到新項目,請讓Windows Service執行操作。

爲什麼不在ASP.NET中做後臺線程?

服務器可能會在某個時間點回收應用程序池,並且不會在單獨的線程上等待您的Task。 (Discussed in this SO question

.NET 4.5.2以上。您可以發射後不管短任務

對於利益着想,您可以使用HostingEnvironment.QueueBackgroundWorkItemsee here)和服務器將尊重背景的項目,而不是recyle應用程序池,而這是繁忙的,但只有最長90秒。更長,Windows Service是你最好的選擇。

HostingEnvironment.QueueBackgroundWorkItem(ct => yourAsyncWork(ct));