【发布时间】:2011-05-24 11:29:09
【问题描述】:
我们有一些长期运行的业务流程正在通过在 WS 2008 R2 上的 IIS(集成模式)中运行的 WCF 服务启动。这些业务流程通常涉及与我们的 SQL Server 后端的大量交互。我们创建了一个自定义任务队列实现,请求通过初始服务调用排队,然后根据优先级执行。此执行可能需要很长时间才能完成(20-30 分钟极端)。然后,客户端可以向服务器查询他们自己的后台任务的进度。
在我们当前的实现中,任务在单独的线程上触发以执行,而不是从 ThreadPool 中触发。这是因为 reading recommendations 没有使用 ThreadPool 运行长时间运行的任务,以防止 ASP.NET 请求被饿死。我们通过对可以并发执行的后台任务数设置上限来控制产生的线程数。通过这种方式,我们尝试控制 CPU 上的负载并防止过多的线程上下文切换。虽然所有这些都在发生,但我们当然还需要为应用程序提供正常的“在线”请求。
在阅读了 Thomas Marquardt 的 this post 之后,我担心我们没有使用 ThreadPool,因为我们无法从其中内置的调整启发式算法中受益。我们已经通过挂钩 ApplicationEnd 事件并取消长时间运行的任务来解决 Thomas 提到的关闭问题。所以我的问题是,我们应该切换到使用 ThreadPool 吗?这些线程被长时间捆绑怎么办?如果我正确理解 Thomas,他说这无关紧要,因为 ThreadPool 会调整自身以创建更多请求来服务于正常的在线操作?我还通读了 this StackOverflow question 涵盖了相同的理由,但我仍然不确定前进的方向。
【问题讨论】:
-
请详细说明:您认为您可能缺少哪些具体的调整?
-
也许“tune”这个词不合适,但我指的是如果后台任务是使用 ThreadPool 线程执行的,那么 ThreadPool“会意识到”额外的“ load”被后台任务放到系统上。如果我们使用普通线程运行它们,那么 ThreadPool 就没有这些知识。同样,我不知道 ThreadPool 启发式如何精确工作的内部细节,但阅读 Thomas 的帖子引起了我的担忧,即我们通过运行它自己的非-ThreadPool 线程
标签: asp.net iis-7 threadpool