1

我的问题集中在一些以前没有失败的Parallel.ForEach代码上,现在我们的数据库已经增长到5倍大,几乎定期打破。在处理非常大的数据集时,Parallel.ForEach抛出异常

Parallel.ForEach<Stock_ListAllResult>(lbStockList.SelectedItems.Cast<Stock_ListAllResult>(), SelectedStock => 
{ 
    ComputeTipDown(SelectedStock.Symbol); 
}); 

的ComputeTipDown()方法获取所有的日常股票TIC数据的符号,并遍历每一天,获取昨天的数据,并做了一些计算,然后将它们插入到数据库中的每一天。

当公式更改时,我们很少使用它来重新计算静态数据值。

例外情况是这样的:

alt text

我们正在进入数据库具有RAM的16场演唱会,是双路四核,没有人再使用该系统,而我是重新计算。运行应用程序以重新生成代码的机器是一台带有12个超线程八进制内核的ram笔记本电脑。所以没有明显的资源争夺。

这是我对使用.NET 4和并行处理的尝试,所以我想知道是否有我丢失的东西。任何想法都会受到欢迎。

+0

任何解决方案与完整的源代码? – Kiquenet 2012-08-22 19:54:25

回答

1

看起来您收到了AggregateException,这是Parallel.ForEach会在任何循环体方法引发异常时引发的。

如果你调试了这个,你应该可以看看InnerExceptions来查看抛出的实际异常。看起来ComputeTipDown在一次或多次迭代中引发异常,导致发生这种情况。

+0

Reed,非常感谢你的建议,我会在ComputeTipDown的捕获中放置一个断点,并会看到会发生什么。 – MikeMalter 2010-09-30 17:23:31

+0

@MikeMalter:您也可以将Parallel.ForEach包装在try/catch中,并捕获AggregateException。这将给你在这一点上的细节...... – 2010-09-30 17:26:24

+0

我通过单击您在答案中提供的AggregateException链接来阅读它。我刚刚得到另一个例外,这次是“真正的”。达到最大池大小。有趣。本周末我将服务器升级到2008 R2,SQL Server升级到2008 R2,并且在此之后,这种情况开始频繁发生。 – MikeMalter 2010-09-30 17:35:05