【问题标题】:Long Running Operations / Threads In ASP.NET IIS SiteASP.NET IIS 站点中长时间运行的操作/线程
【发布时间】:2014-07-24 19:55:35
【问题描述】:

线程系统如何在 ASP.NET MVC 上工作?

如果我在一个请求上生成一个新线程,它会执行某项任务。当请求结束或超时时,这个线程会被杀死吗?

例如,

我有一个接收 csv 文件的操作方法,需要对其进行解析并保存到数据库中。现在执行此操作的正确方法是运行执行这些请求的服务,但是在我的情况下,此导入只会每月发生一次,对我们而言,维护 24/7 运行的服务是不值得的从中受益。

是否有一种服务可以在 IIS 环境中运行,不受 HTTP 请求状态的影响?

【问题讨论】:

  • 查看revalee.sageanalytic.com。实现起来非常简单,并允许您在请求周期之外触发要处理的任务。

标签: c# asp.net-mvc multithreading iis


【解决方案1】:

您将始终受制于应用程序池的生命周期设置。如果在任何时候,没有其他请求进入 IIS 也由应用程序池提供服务,则您的请求将在应用程序池关闭时停止。您有两个选择:增加应用程序池的生命周期或走 Windows 服务路线。您可以在上传之前编写脚本来延长池的生命周期,然后将其重新编写为更短、更易于管理的长度。

【讨论】:

  • 我喜欢这个主意。这不是一个巨大的文件,我无法想象它需要超过 4 - 5 分钟。没有办法为某个线程指定生命周期?
  • 这里的问题不是线程生命周期,而是应用程序池的生命周期。该线程是进程绑定的,因此当应用程序池回收时,它会被它吞噬。但是,即使您延长应用程序池回收之间的时间,还有其他外部因素会导致它过早回收。坦率地说,这是一个动态过程,试图在其上强加静态主义是错误的。
  • 在这种特定情况下,还存在未处理的文件句柄和数据库连接的问题。这里涉及的不仅仅是托管代码。
【解决方案2】:

扩展 Josh 的回答。请求处理一结束,线程就不会被杀死。但是,如果您的应用程序池的 w3wp 由于某种原因被杀死,它可能会被杀死。出于 Josh 所说的原因,这也可能发生在异常冒泡而没有被您的代码处理的情况下,并且应用程序池可能会因多种原因而回收。

Windows 服务是一种解决方案。在一个项目中,我使用 AppFabric 将应用程序池设置为永不回收并始终保持开启状态。这对我来说非常有效,对于客户的具体故事,也可能是适合您的解决方案。

查看here了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 2011-04-15
    • 1970-01-01
    相关资源
    最近更新 更多