我有一个基于IIS 6.0的C#/ ASP.NET网站,带有SQL服务器后端。我想在空闲的CPU时间内生成一些计算成本高昂的报告(摘要,搜索引擎索引等)。我需要从IIS应用程序池中生成报告,因此它知道正确的配置设置和(更难修复)避免了我被置于其中的噩梦般的安全限制。
我可以在AppPool的进程内启动不会占用CPU的线程,因此它可以继续提供不受约束的请求吗?如果是这样,怎么样?什么代码和库?
我想它涉及ThreadPool和线程优先级,但我找不到低pri线程及其与IIS Web服务器和App池的交互的良好覆盖。
[EDIT] http://msdn.microsoft.com/en-us/magazine/cc163854.aspx#S7讨论了如何使用Timer,但没有直接声明.NET框架将确保Timer线程是低优先级的。这可能是一个解决方案,但有保证吗?
[编辑]这家伙谈到了与重要的例外相关的问题:http://flimflan.com/blog/SafelyRunningBackgroundThreadsInASPNET20.aspx
[编辑]有趣的是,Stack Overflow本身似乎使用IIS后台线程来实现我的目的:http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/ ...在评论中,每个人都说他们(不再使用)技术很糟糕,但是this one在评论中对我有意义......
答案 0 :(得分:3)
除了轮询应用程序池以获得低CPU使用率之外,为什么不假设当系统处于最轻负载(工作时间等等......)之后使用量会很低然后您可以在该窗口期间安排报告而不用担心CPU使用率会使系统紧张。
答案 1 :(得分:2)
你可以启动一个线程,然后在后台运行它。这将使它的优先级低于常规UI线程。
答案 2 :(得分:0)
我能说出来,令人惊讶的是,没有好的答案。我能想到的最好的答案是在IIS中运行后台线程,并有一个单独的轮询请求者偶尔ping服务器以确保它是醒着的。如果有人想出一个比这更好的答案,我会重新分配复选标记......