Asp.net 在IIS中管理后台线程的一些最佳实践是什么?

Asp.net 在IIS中管理后台线程的一些最佳实践是什么?,asp.net,multithreading,httpmodule,Asp.net,Multithreading,Httpmodule,我已经编写了一个生成后台线程的HttpModule。我使用线程就像一个在进程中运行的计划任务,这非常方便 跟踪此线程的最佳实践是什么?我以前从未这样做过,我对它的某些方面有点困惑: 如何知道线程是否仍在运行?我看到它做了它的工作,但是有没有其他方法可以知道它是否还活着?我下载了ProcMon,但是w3wp.exe产生了大量线程,所以我不知道哪个是我的线程。我给它起了个名字,但没用 如果线死了,我如何“抓住”它?是否有某种Dispose方法,如果失败,我可以让它写入事件日志或其他内容?“死亡宣言”

我已经编写了一个生成后台线程的HttpModule。我使用线程就像一个在进程中运行的计划任务,这非常方便

跟踪此线程的最佳实践是什么?我以前从未这样做过,我对它的某些方面有点困惑:

  • 如何知道线程是否仍在运行?我看到它做了它的工作,但是有没有其他方法可以知道它是否还活着?我下载了ProcMon,但是w3wp.exe产生了大量线程,所以我不知道哪个是我的线程。我给它起了个名字,但没用

  • 如果线死了,我如何“抓住”它?是否有某种Dispose方法,如果失败,我可以让它写入事件日志或其他内容?“死亡宣言”还是什么

  • 如何主动停止线程?如果我想让它停止运行这个后台进程,如何在不反弹IIS的情况下杀死它

  • 是否可以独立于HttpModule再次启动它?(我猜答案是否定的。)


  • 编辑:我只是想澄清一下,我的想法是我的帖子永远不会消失。它运行一个函数,然后进入睡眠状态几分钟,然后醒来并再次运行该函数。这不像是只完成一项任务就结束了。

    根据我的经验,你可以让它“足够好”,但并不完美。我建议您在windows服务中实现重复任务。根据任务所做的,Windows服务甚至可能不必与web应用程序对话,反之亦然,例如。G如果两者都使用相同的数据库。否则你仍然可以使用e。G用于通信的WCF

    最大的优点是:windows服务将从操作系统启动,您可以使用控制面板轻松配置、启动和停止它,您可以通过windows事件日志进行内置监控,您可以独立更新后台服务和web应用程序等

    如果这不是一个选项,例如。G由于您处于共享主机环境中,我建议您:

  • 在Application_Start(Global.asax)中启动后台线程,并将线程引用存储在静态变量中
  • 使用try/catch包装在后台线程上调用的每个方法,因为自.NET2.0以来,后台线程上的每个未处理异常都将关闭应用程序。(它将在下一个请求时重新启动,但会减慢下一个请求的速度,终止所有当前会话和缓存,当然,在下一个请求之前,没有计时器处于活动状态。)
  • 在每个请求上(实现时有一个HttpModule或再次在Global.asax中),检查全局变量中的线程实例(是否仍然!=null,线程是否处于活动状态并正在运行等)。如果没有,请调用重新启动代码。在重启部件中使用锁定,以确保不会同时创建两次线程

  • 即使这样,如果你没有24小时正常的流量,你也不能确定你的后台线程是否一直在运行。还要记住,在共享托管环境中,如果几个小时内没有活动,则关闭应用程序池是非常常见的。您可以尝试通过在自己网络上的客户机上设置计划任务,每隔几分钟对您的应用程序执行一次轻量级HTTP请求,以确保您的应用程序始终处于运行状态来改善这一点。

    Jeff使Stackoverflow时,他也遇到了类似的问题

    他的解决方案是使用缓存过期。您应该在缓存中放入一些内容,然后当它过期时,将在非面向用户的线程中触发一个事件。在过期事件处理程序中,插入一些代码以将项重新添加到缓存中,并为应用程序执行任何需要执行的内务管理工作

    使用此技巧,您的子问题很容易得到回答:

  • 您检查项目是否仍在 缓存
  • 如果项目不在 缓存,重新添加它
  • 移除 从缓存中缓存项
  • 加 将该项返回到缓存
  • 您可以创建一个小的管理页面来配置这些选项


    这为您提供了一种在web应用程序中大致计算内务处理时间的好方法。它不需要单独的Windows服务,这是一个巨大的成功

    您是否收到system.timeout错误?忽略。这不应该适用于这个