C# 如何利用IIS应用程序池中的空闲CPU时间?

C# 如何利用IIS应用程序池中的空闲CPU时间?,c#,asp.net,iis,iis-6,threadpool,C#,Asp.net,Iis,Iis 6,Threadpool,我有一个基于IIS 6.0的C#/ASP.NET网站,带有SQL server后端。我想在空闲的CPU时间内生成一些计算量大的报告(摘要、搜索引擎索引等)。我需要从IIS应用程序池中生成报告,以便它知道正确的配置设置,并(更难修复)避免我所面临的噩梦般的安全限制 我是否可以在AppPool的进程内启动线程,使其不会占用CPU,从而继续不受限制地服务请求?如果是,怎么做?什么代码和库 我想这涉及到线程池和线程优先级,但我找不到低优先级线程及其与IIS web服务器和应用程序池交互的良好覆盖范围 [

我有一个基于IIS 6.0的C#/ASP.NET网站,带有SQL server后端。我想在空闲的CPU时间内生成一些计算量大的报告(摘要、搜索引擎索引等)。我需要从IIS应用程序池中生成报告,以便它知道正确的配置设置,并(更难修复)避免我所面临的噩梦般的安全限制

我是否可以在AppPool的进程内启动线程,使其不会占用CPU,从而继续不受限制地服务请求?如果是,怎么做?什么代码和库

我想这涉及到线程池和线程优先级,但我找不到低优先级线程及其与IIS web服务器和应用程序池交互的良好覆盖范围

[EDIT]讨论了为此使用计时器,但没有直接说明.NET framework将确保计时器线程的优先级较低。这可能是一个解决方案,但这能保证吗

[编辑]这家伙谈到了与异常相关的重要问题:


[编辑]有趣的是,堆栈溢出本身似乎使用IIS后台线程来实现我的目的:。在评论中,每个人都说他们(不再使用)的技术很糟糕,但在评论中,我觉得很有意义…

你可以启动一个线程,并在后台运行它。这将使其优先级低于常规UI线程。

与其轮询应用程序池的cpu使用率低,为什么不假设当系统负载最轻时(工作时间后等),cpu使用率会很低然后,您可以简单地在该窗口期间安排报告,而不必担心CPU使用会使系统紧张。

正如我所知,令人惊讶的是,没有好的答案。我能想到的最佳答案是在IIS中运行后台线程,并让一个单独的轮询请求程序偶尔ping一下服务器以确保它处于唤醒状态。如果有人想出比这更好的答案,我会重新分配复选标记,不过…

我也打算这么做,但是a)一些报告最好尽快生成,b)如果我可以利用空闲时间,我可以用它来实现Geni.com风格的“我会尽快告诉你”键入报告生成。我不相信你能做到这一点…想要XXXX.com样式的报告是可以的,但不知道它们的方法。当你知道强加给你的限制时,你怎么能实现它?考虑到应用程序负载不足时cpu利用率的“尖峰”性质,我认为不会有足够大的窗口在创建报告时不拖累站点性能。更重要的原因是IIS应用程序池通常在闲置一段时间后自行终止,这样他们就不会醒来了!我不认为在IIS中运行长时间运行的代码是最好的主意——不是因为它不起作用,而是因为如果您超过内存或CPU阈值,IIS可能只是循环使用您的进程,您需要使您的代码对此具有弹性——例如,保存状态并在新工作程序备份后恢复状态。查看HostingEnvironment.IRegisteredObject和此处,如果您没有任何请求,IIS可能会关闭进程。@ToxicAvenger:当然可以。IIS自动回收是我必须避免的一个陷阱。在这种情况下,由于安全策略超出了我的控制范围,我认为除了在IIS中运行它之外,我别无选择。我不得不把这个简单但未说出口的想法抛在脑后,让一个单独的服务器来做这个处理怎么样?硬件的总体拥有成本通常非常低。实际上,Word Automation Services(SharePoint 2010文档转换的一部分,例如Word docx->PDF)位于IIS托管的WCF服务中,但会启动一个.exe来执行实际转换。通信IIS服务.exe是WCF。@ToxicAvenger:这是一个有趣的想法。这可能会避免IIS循环使用中间进程,并为您提供所需的权限和配置,以及能够启动低优先级进程?