【发布时间】:2014-04-10 19:55:06
【问题描述】:
我在通过 ThreadPool.QueueUserWorkItem 调用的 ASP.NET 应用程序中长时间调用 Web 服务。该调用大约需要 2 分钟才能完成,并将大约 2000 条记录发送到外部数据存储。一切似乎都运行顺利,除了我注意到在运行 IIS7 的生产环境中进行这些调用时,仅使用了 1 个 CPU 内核,并且已被最大化。我怎样才能平衡所有可用 CPU 内核的工作负载?
【问题讨论】:
-
您排队了 2000 条记录,还是排队了包含 2000 条记录的一项?
-
1 项包含 2000 条记录。 ThreadPool.QueueUserWorkItem 调用的方法遍历 2000 条记录,并通过 SOAP 客户端和服务引用将每条记录发送到第三方数据存储,真正使事情陷入停顿的是 SOAP 调用。每条记录只发送 4 个字段,它们只包含小字符串和整数。
-
那么……问题是什么?您正在排队 1 个项目,这意味着您正在进行 1 个方法调用,您最好不要将它排队并简单地调用它。基本上,你不是在做多线程的。
-
不,线程池将平衡您跨内核排队的项目。您排队了 1 个项目,因此它将 1 个项目提供给 1 个核心。如果您排队 2000 个项目,它们将被“平衡”。简单地在线程池中排队 1 个项目并不会神奇地使该 1 个执行路径成为多线程。
-
所以你必须分成 2000 次调用 QueueUserWorkItem
标签: c# asp.net threadpool