【问题标题】:Parallel.ForEach error: The query processor could not start the necessary thread resources for parallel query executionParallel.ForEach 错误:查询处理器无法启动并行查询执行所需的线程资源
【发布时间】:2014-12-05 18:56:21
【问题描述】:

在 c# 中使用 TPL Parallel.ForEach() 方法执行多个线程时遇到问题。多处理访问数据库,我还用 using 语句包装每个操作,以便在每次执行后处理连接。

我得到的错误是:查询处理器无法启动并行查询执行所需的线程资源

经过大量谷歌搜索后,SQL 因太忙或导致一些内存泄漏而耗尽资源。

我也尝试在 Parallel.ForEach() 中设置 ParallelOptions 参数并设置 MaxDegreeOfParallelism = 2 但这没有帮助。即

Parallel.ForEach(customerNumbers, cno =>
{
   using (var ctx = new MyContext())
   {
       // do database call
   }
}, new ParallelOptions { MaxDegreeOfParallelism = 2 });

谁能告诉我如何解决这个问题?

【问题讨论】:

  • 你为什么不在 Stackoverflow 上问这个非常明显的编程问题?
  • @Maxwell Maake:您的 SQL Server 设置使用多少个工作线程?见msdn.microsoft.com/en-us/library/ms190219%28v=sql.100%29.aspx
  • 另外,如果您发布一个 SQL 查询示例,以防您正在做一些可以简化的非常复杂的事情,这可能会有所帮助。您可以在编辑查询时使用 Display Estimated Execution Plan 来查看联接或子查询是否占用了大量资源。
  • 最后,如果将代码移出 Parallel.ForEach 块,是否还会发生这种情况?
  • 重启服务器 - 对我有用。

标签: c# parallel-processing multithreading


【解决方案1】:

问题不在于 C#,而在于您的 SQL Server。您的 SQL 服务器正在拒绝多个同时调用。

请确认:

  1. 您在连接字符串中打开了“多个活动结果集”。 See here.(这是最有可能/最明显的)
  2. 您仍在达到最大并行度 (MAXDOP)。确保它最初设置为“0”(意思是 - 使用你想要的所有资源)。如果这可行,但您对 0 不满意,请从那里开始削减它。
  3. 获取您的查询并将其移至 SSMS 并在那里运行。这可能是查询太复杂了,尽管这不太可能。 See here for more info.

【讨论】:

  • 将最大并行度设置为“0”似乎不起作用。我注意到我的连接字符串中没有打开多个活动结果集,所以我打开它并且似乎没有发生错误。我会监控它。感谢您的回答
猜你喜欢
  • 2011-12-08
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多