【发布时间】:2011-03-15 11:59:21
【问题描述】:
我有一个带有 SQL 服务器后端的基于 IIS 6.0 的 C#/ASP.NET 网站。我想在空闲 CPU 时间生成一些计算量大的报告(摘要、搜索引擎索引等)。我需要从 IIS 应用程序池中生成报告,以便它知道正确的配置设置并(更难修复)避免我被置于噩梦般的安全限制之下。
我能否在 AppPool 的进程中启动不会占用 CPU 的线程,以便它可以继续不受限制地处理请求?如果是这样,怎么做?什么代码和库?
我想它涉及 ThreadPool 和线程优先级,但我找不到低优先级线程及其与 IIS Web 服务器和应用程序池交互的良好覆盖范围。
[编辑]http://msdn.microsoft.com/en-us/magazine/cc163854.aspx#S7 讨论为此使用 Timer,但没有直接说明 .NET 框架将确保 Timer 线程是低优先级的。这可能是一个解决方案,但有保证吗?
[编辑] 这个人谈论与异常相关的重要问题:http://flimflan.com/blog/SafelyRunningBackgroundThreadsInASPNET20.aspx
[编辑] 有趣的是,Stack Overflow 本身似乎使用 IIS 后台线程来达到我的目的:https://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/..。在 cmets 中,每个人都说他们(不再使用)的技术很烂,但是 cmets 中的 this one 对我来说很有意义......
【问题讨论】:
-
我不认为在 IIS 中运行长时间运行的代码是最好的想法 - 不是因为它不起作用,而是因为如果您超过内存或 CPU 阈值,IIS 可能只是回收您的流程,并且您需要使您的代码具有弹性 - 例如,保存状态并在新工作人员备份后恢复它。看看 HostingEnvironment.IRegisteredObject 和这里 hyperthink.net/blog/recycling-appdomains-not-cans 如果你没有任何请求,IIS 可能会关闭进程。
-
@ToxicAvenger:当然。 IIS 自动回收是我必须避免的一个陷阱。在这种情况下,由于安全策略超出了我的控制范围,我认为除了在 IIS 中运行它之外别无选择。
-
我不得不把这个简单但不言而喻的想法扔出去,让一个单独的服务器来做这个处理怎么样?硬件通常具有非常低的 TCO。
-
实际上,Word Automation Services(用于文档转换的 SharePoint 2010 的一部分,例如 Word docx -> PDF)位于 IIS 托管的 WCF 服务中,但会启动一个 .exe 来进行实际转换。通信 IIS 服务 .exe 是 WCF。
-
@ToxicAvenger:这是一个有趣的想法。这可能会避免 IIS 在进程中回收,还可以为您提供所需的权限和配置,以及能够启动低优先级进程?
标签: c# asp.net iis iis-6 threadpool