【问题标题】:ASP MVC app resets on long running threadASP MVC 应用程序在长时间运行的线程上重置
【发布时间】:2015-08-24 13:05:56
【问题描述】:

在我的 ASP MVC 5 应用程序中,我有这个与数据库相关的操作,我可能需要每月执行一次,大约需要 30 到 60 分钟。 我这样开始这个动作:

    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 分钟后,我退出了应用程序。我认为应用程序重置是因为我使用的一些静态变量被重置。 在 elmah 我没有任何错误。我把我的代码放在 Try Catch 块中。

只希望你们:)

【问题讨论】:

  • "operation that I've to perform once in month maybe and it takes about 30 - 60 minutes" - 这不是 Web 应用程序的任务。这是计划的控制台应用程序或可能是 Windows 服务的任务。
  • 或使用 ASP.NET MVC 的任务调度程序库,如 github.com/jgeurts/FluentScheduler

标签: c# asp.net asp.net-mvc entity-framework


【解决方案1】:

正如@David 所说,最好走Windows Service 路线:

  • 将项目写入数据库表
  • Windows Service 每个月(或者您需要的任何时候)轮询表格。
  • 如果在队列中发现新项目,则让Windows Service 执行操作。

为什么不在 ASP.NET 中使用后台线程?

服务器可能会在某个时候回收应用程序池,并且不知道在单独的线程上等待您的Task。 (Discussed in this SO question)

.NET 4.5.2 以后。您可以解雇并忘记短任务

出于兴趣,您可以使用HostingEnvironment.QueueBackgroundWorkItem (see here),服务器将尊重后台项目,并且不会在应用程序池繁忙时回收它,但最多只能持续 90 秒。再长一点,Windows Service 是你最好的选择。

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

【讨论】:

    【解决方案2】:

    Hangfire 非常适合这样的东西。

    https://www.nuget.org/packages/Hangfire/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      • 2013-07-17
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      相关资源
      最近更新 更多