2015-08-24 114 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)); 
相关问题