这是一个控制台应用程序,我有一个foreach,遍历Id列表并从mapper(数据库)中获取该Id的数据。为每个列表提取数据后,它将创建csv文件。 有近84个列表,每个列表有1000个ID。当我出现内存异常时,我将其拆分了。
List<TruckSpec> ts = null;
Parallel.ForEach(lists, list =>
{
string csv = string.Empty;
long max = list.Max();
long min = list.Min();
ts = tsmapper.SelectByList(min, max);
GetCSV(delimeter, ts, nameofile, filepath, mqftcall);
});
所以,我决定使用并行处理来加速这个过程。
但问题是映射器函数selectByList(min,max)值会因每个列表而改变。我收到此错误&#34;收集被修改:枚举可能无法执行&#34;通过mapper函数运行时。
你能帮我吗?我不应该使用parallel.foreach这种情况吗?如果我可以使用parallel.froeach,我该如何解决这个问题。
答案 0 :(得分:0)
请记住,使用多处理时,您可以随时进行上下文切换。你可以点击第7行(ts = tsmapper.SelectByList(min,max);),然后在第8行击中第7行3次之前。最后,一旦你用第一个线程命中第8行,数据可能会发生重大变化。
或者当上下文切换发生时,GetCSV可能忙于迭代ts,从而改变数据。
根据您的用法,它看起来像List ts = null;应该只在并行循环内声明,而不是在它之外。