Parallel.ForEach错误:查询处理器无法启动并行查询执行所需的线程资源

时间:2014-10-10 11:28:51

标签: c# parallel-processing multithreading

在使用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 });

有人能告诉我如何解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

问题不在于C#,而在于你的SQL Server。您的SQL服务器拒绝多个同时呼叫。

请确保:

  1. 您的连接字符串中已启用“多个活动结果集”。 See here.(这是最有可能/特别的)
  2. 你还在达到最大并行度(MAXDOP)。确保它最初设置为“0”(意思是 - 使用您想要的所有资源)。如果这样可行,但你对0不满意,那就从那里开始切割它。
  3. 接受您的查询并将其移至SSMS并在那里运行。这可能是查询过于复杂,尽管这不太可能。 See here for more info.